<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
                      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
    <title>Zend_Db_Adapter - Zend Framework Manual</title>

    <link href="../css/shCore.css" rel="stylesheet" type="text/css" />
    <link href="../css/shThemeDefault.css" rel="stylesheet" type="text/css" />
    <link href="../css/styles.css" media="all" rel="stylesheet" type="text/css" />
</head>
<body>
<h1>Zend Framework</h1>
<h2>Programmer's Reference Guide</h2>
<ul>
    <li><a href="../en/zend.db.adapter.html">Inglês (English)</a></li>
    <li><a href="../pt-br/zend.db.adapter.html">Português Brasileiro (Brazilian Portuguese)</a></li>
</ul>
<table width="100%">
    <tr valign="top">
        <td width="85%">
            <table width="100%">
                <tr>
                    <td width="25%" style="text-align: left;">
                    <a href="zend.db.html">Zend_Db</a>
                    </td>

                    <td width="50%" style="text-align: center;">
                        <div class="up"><span class="up"><a href="zend.db.html">Zend_Db</a></span><br />
                        <span class="home"><a href="manual.html">Guia de Refer&ecirc;ncia do Programador</a></span></div>
                    </td>

                    <td width="25%" style="text-align: right;">
                        <div class="next" style="text-align: right; float: right;"><a href="zend.db.statement.html">Zend_Db_Statement</a></div>
                    </td>
                </tr>
            </table>
<hr />
<div id="zend.db.adapter" class="section"><div class="info"><h1 class="title">Zend_Db_Adapter</h1></div>
    

    <p class="para">
        <span class="classname">Zend_Db</span> e suas classes relacionadas provêem uma interface de banco
        de dados <acronym class="acronym">SQL</acronym> simples para Zend Framework.
        <span class="classname">Zend_Db_Adapter</span> é a classe básica que você usa para conectar sua
        aplicação <acronym class="acronym">PHP</acronym>a um <acronym class="acronym">SGBDR</acronym>. Há uma classe adaptadora
        diferente para cada marca de <acronym class="acronym">SGBDR</acronym>.
    </p>

    <p class="para">
        Os adaptadores <span class="classname">Zend_Db</span> criam uma ponte entre extensões
        <acronym class="acronym">PHP</acronym> específicas de cada fabricante para uma interface comum que ajuda
        você a escrever aplicações <acronym class="acronym">PHP</acronym> uma vez e distribui-las com múltiplas
        marcas de <acronym class="acronym">SGBDR</acronym> com muito pouco esforço.
    </p>

    <p class="para">
        A interface da classe adaptadora é similar à interface da extensão
        <a href="http://www.php.net/pdo" class="link external">&raquo; PHP Data Objects</a>.
        <span class="classname">Zend_Db</span> provê classes adaptadoras para drivers
        <acronym class="acronym">PDO</acronym> das seguintes marcas de <acronym class="acronym">SGBDR</acronym>:
    </p>

    <ul class="itemizedlist">
        <li class="listitem">
            <p class="para">
                <acronym class="acronym">IBM</acronym> <acronym class="acronym">DB2</acronym> e Informix Dynamic Server
                (<acronym class="acronym">IDS</acronym>), usando a extensão <acronym class="acronym">PHP</acronym>
                <a href="http://www.php.net/pdo-ibm" class="link external">&raquo; pdo_ibm</a>
            </p>
        </li>

        <li class="listitem">
            <p class="para">
                MariaDB, usando a extensão <acronym class="acronym">PHP</acronym>
                <a href="http://www.php.net/pdo-mysql" class="link external">&raquo; pdo_mysql</a>
            </p>
        </li>

        <li class="listitem">
            <p class="para">
                MySQL, usando a extensão <acronym class="acronym">PHP</acronym>
                <a href="http://www.php.net/pdo-mysql" class="link external">&raquo; pdo_mysql</a>
            </p>
        </li>

        <li class="listitem">
            <p class="para">
                Microsoft <acronym class="acronym">SQL</acronym> Server, usando a extensão <acronym class="acronym">PHP</acronym>
                <a href="http://www.php.net/pdo-dblib" class="link external">&raquo; pdo_dblib</a>
            </p>
        </li>

        <li class="listitem">
            <p class="para">
                Oracle, usando a extensão <acronym class="acronym">PHP</acronym>
                <a href="http://www.php.net/pdo-oci" class="link external">&raquo; pdo_oci</a>
            </p>
        </li>

        <li class="listitem">
            <p class="para">
                PostgreSQL, usando a extensão <acronym class="acronym">PHP</acronym>
                <a href="http://www.php.net/pdo-pgsql" class="link external">&raquo; pdo_pgsql</a>
            </p>
        </li>

        <li class="listitem">
            <p class="para">
                SQLite, usando a extensão <acronym class="acronym">PHP</acronym>
                <a href="http://www.php.net/pdo-sqlite" class="link external">&raquo; pdo_sqlite</a>
            </p>
        </li>
    </ul>

    <p class="para">
        Além disso, <span class="classname">Zend_Db</span> provê classes adaptadoras que utilizam extensões
        de bancos de dados
        <acronym class="acronym">PHP</acronym> para as seguintes marcas de <acronym class="acronym">SGBDR</acronym>:
    </p>

    <ul class="itemizedlist">
        <li class="listitem">
            <p class="para">
                MariaDB, usando a extensão <acronym class="acronym">PHP</acronym>
                <a href="http://www.php.net/mysqli" class="link external">&raquo; mysqli</a>
            </p>
        </li>

        <li class="listitem">
            <p class="para">
                MySQL, usando a extensão <acronym class="acronym">PHP</acronym>
                <a href="http://www.php.net/mysqli" class="link external">&raquo; mysqli</a>
            </p>
        </li>

        <li class="listitem">
            <p class="para">
                Oracle, usando a extensão <acronym class="acronym">PHP</acronym>
                <a href="http://www.php.net/oci8" class="link external">&raquo; oci8</a>
            </p>
        </li>

        <li class="listitem">
            <p class="para">
                <acronym class="acronym">IBM</acronym> <acronym class="acronym">DB2</acronym> e <acronym class="acronym">DB2</acronym> I5, usando a
                extensão <acronym class="acronym">PHP</acronym> <a href="http://www.php.net/ibm_db2" class="link external">&raquo; ibm_db2</a>
            </p>
        </li>

        <li class="listitem">
            <p class="para">
                Firebird (Interbase), usando a extensão <acronym class="acronym">PHP</acronym> <a href="http://www.php.net/ibase" class="link external">&raquo; php_interbase</a>
            </p>
        </li>
    </ul>

    <blockquote class="note"><p><b class="note">Note</b>: 
        <p class="para">
            Cada classe adaptadora <span class="classname">Zend_Db</span> usa uma extensão
            <acronym class="acronym">PHP</acronym>. Você deve ter a respectiva extensão <acronym class="acronym">PHP</acronym>
            habilitada em seu ambiente <acronym class="acronym">PHP</acronym> para usar uma classe adaptadora
            <span class="classname">Zend_Db</span>. Por exemplo, se você usa qualquer uma das classes
            adaptadoras <acronym class="acronym">PDO</acronym> do <span class="classname">Zend_Db</span>
            , você precisa habilitar tanto a extensão <acronym class="acronym">PDO</acronym> quanto o driver
            <acronym class="acronym">PDO</acronym> para a marca de <acronym class="acronym">SGBDR</acronym> que você usa.
        </p>
    </p></blockquote>

    <div class="section" id="zend.db.adapter.connecting"><div class="info"><h1 class="title">Conectando-se a um Banco de Dados Usando uma Adaptadora</h1></div>
        

        <p class="para">
            Esta seção descreve como criar uma instância de uma classe adaptadora de banco de
            dados. Isso corresponde a fazer uma conexão com seu servidor <acronym class="acronym">SGBDR</acronym> a
            partir de sua aplicação <acronym class="acronym">PHP</acronym>.
        </p>

        <div class="section" id="zend.db.adapter.connecting.constructor"><div class="info"><h1 class="title">Usando um Construtor de Adaptadora Zend_Db</h1></div>
            

            <p class="para">
                Você pode criar uma instância de uma classe adaptadora usando seu construtor.
                Um construtor de classe adaptadora leva um argumento, que é um matriz
                de parâmetros usado para declarar a conexão.
            </p>

            <div class="example" id="zend.db.adapter.connecting.constructor.example"><div class="info"><p><b>Example #1 Usando um Construtor de Adaptadora</b></p></div>
                

                <pre class="programlisting brush: php">
$db = new Zend_Db_Adapter_Pdo_Mysql(array(
    &#039;host&#039;     =&gt; &#039;127.0.0.1&#039;,
    &#039;username&#039; =&gt; &#039;webuser&#039;,
    &#039;password&#039; =&gt; &#039;xxxxxxxx&#039;,
    &#039;dbname&#039;   =&gt; &#039;test&#039;
));
</pre>

            </div>
        </div>

        <div class="section" id="zend.db.adapter.connecting.factory"><div class="info"><h1 class="title">Usando a Fábrica Zend_Db</h1></div>
            

            <p class="para">
                Como uma alternativa ao uso direto do construtor da classe adaptadora, você
                pode criar uma instância de uma adaptadora usando o método estático
                 <span class="methodname">Zend_Db::factory()</span>. Este método carrega dinamicamente
                o arquivo da classe adaptadora sob demanda usando o método
                <a href="zend.loader.load.html#zend.loader.load.class" class="link">Zend_Loader::loadClass()</a>.
            </p>

            <p class="para">
                O primeiro argumento é um string que identifica o nome base da
                classe adaptadora. Por exemplo, a string &#039;<span class="classname">Pdo_Mysql</span>&#039;
                corresponde à classe <span class="classname">Zend_Db_Adapter_Pdo_Mysql</span>. O segundo
                argumento é a mesma matriz de parâmetros que você teria passado para
                o construtor da adaptadora.
            </p>

            <div class="example" id="zend.db.adapter.connecting.factory.example"><div class="info"><p><b>Example #2 Using the Adapter Factory Method</b></p></div>
                

                <pre class="programlisting brush: php">
// Nós não precisamos seguir a declaração a seguir porque o
// arquivo Zend_Db_Adapter_Pdo_Mysql será carregado para nós pelo método Zend_Db
// factory.

// require_once &#039;Zend/Db/Adapter/Pdo/Mysql.php&#039;;

// Carrega automaticamente a classe Zend_Db_Adapter_Pdo_Mysql
// e cria uma instância dela.
$db = Zend_Db::factory(&#039;Pdo_Mysql&#039;, array(
    &#039;host&#039;     =&gt; &#039;127.0.0.1&#039;,
    &#039;username&#039; =&gt; &#039;webuser&#039;,
    &#039;password&#039; =&gt; &#039;xxxxxxxx&#039;,
    &#039;dbname&#039;   =&gt; &#039;test&#039;
));
</pre>

            </div>

            <p class="para">
                Se você criar sua própria classe que estende
                <span class="classname">Zend_Db_Adapter_Abstract</span>, mas não nomear sua
                classe com o prefixo de pacote &quot;<span class="classname">Zend_Db_Adapter</span>&quot;, você pode
                usar o método  <span class="methodname">factory()</span> para carregar sua adaptadora se
                você especificar a parte principal da classe adaptadora com a
                chave &#039;adapterNamespace&#039; na matriz de parâmetros.
            </p>

            <div class="example" id="zend.db.adapter.connecting.factory.example2"><div class="info"><p><b>Example #3 
                Usando o Método de Fábrica da Adaptadora para uma Classe Adaptadora Personalizada
                </b></p></div>
                

                <pre class="programlisting brush: php">
// Nós não precisamos carregar o arquivo da classe adaptadora
// porque ele será carregado para nós pelo método de fábrica do Zend_Db.

// Carrega automaticamente a classe MyProject_Db_Adapter_Pdo_Mysql e cria
// uma instância dela.
$db = Zend_Db::factory(&#039;Pdo_Mysql&#039;, array(
    &#039;host&#039;             =&gt; &#039;127.0.0.1&#039;,
    &#039;username&#039;         =&gt; &#039;webuser&#039;,
    &#039;password&#039;         =&gt; &#039;xxxxxxxx&#039;,
    &#039;dbname&#039;           =&gt; &#039;test&#039;,
    &#039;adapterNamespace&#039; =&gt; &#039;MyProject_Db_Adapter&#039;
));
</pre>

            </div>
        </div>

        <div class="section" id="zend.db.adapter.connecting.factory-config"><div class="info"><h1 class="title">Usando Zend_Config com Zend_Db Factory</h1></div>
            

            <p class="para">
                Opcionalmente, você pode especificar cada argumento do
                método  <span class="methodname">factory()</span> como um objeto do tipo
                <a href="zend.config.html" class="link">Zend_Config</a>.
            </p>

            <p class="para">
                Se o primeiro argumento é um objeto de configuração, espera-se que
                ele contenha uma propriedade chamada <span class="property">adapter</span>, contendo uma
                string que designa a base do nome da classe adaptadora. Opcionalmente, o objeto
                pode conter uma propriedade chamada <span class="property">params</span>, com
                subpropriedades correspondentes aos nomes de parâmetro da adaptadora.
                Isso é usado somente se o segundo argumento do
                método  <span class="methodname">factory()</span> for omitido.
            </p>

            <div class="example" id="zend.db.adapter.connecting.factory.example1"><div class="info"><p><b>Example #4 Usando o Método de Fábrica da Adaptadora com um Objeto Zend_Config</b></p></div>
                

                <div class="example-contents"><p>
                    No exemplo abaixo, um objeto <span class="classname">Zend_Config</span> é criado
                    a partir de um matriz. Você pode também carregar dados a partir de um arquivo
                    externo usando classes tais como
                    <a href="zend.config.adapters.ini.html" class="link">Zend_Config_Ini</a>
                    e <a href="zend.config.adapters.xml.html" class="link">Zend_Config_Xml</a>.
                </p></div>

                <pre class="programlisting brush: php">
$config = new Zend_Config(
    array(
        &#039;database&#039; =&gt; array(
            &#039;adapter&#039; =&gt; &#039;Mysqli&#039;,
            &#039;params&#039;  =&gt; array(
                &#039;host&#039;     =&gt; &#039;127.0.0.1&#039;,
                &#039;dbname&#039;   =&gt; &#039;test&#039;,
                &#039;username&#039; =&gt; &#039;webuser&#039;,
                &#039;password&#039; =&gt; &#039;secret&#039;,
            )
        )
    )
);

$db = Zend_Db::factory($config-&gt;database);
</pre>

            </div>

            <p class="para">
                O segundo argumento do método  <span class="methodname">factory()</span> pode ser
                um matriz associativo contendo entradas correspondentes aos
                parâmetros da adaptadora. Esse argumento é opcional. Se o primeiro
                argumento é do tipo <span class="classname">Zend_Config</span>, é assumido que ele contém
                todos os parâmetros, e o segundo argumento é ignorado
            </p>
        </div>

        <div class="section" id="zend.db.adapter.connecting.parameters"><div class="info"><h1 class="title">Parâmetros da Adaptadora</h1></div>
            

            <p class="para">
                A seguinte lista explica parâmetros comuns reconhecidos pelas
                classes adaptadoras <span class="classname">Zend_Db</span>.
            </p>

            <ul class="itemizedlist">
                <li class="listitem">
                    <p class="para">
                        <em class="emphasis">host</em>:
                        uma string contendo um hostname ou endereço IP do
                        servidor de banco de dados. Se o banco de dados está rodando no
                        mesmo servidor anfitrião da aplicação <acronym class="acronym">PHP</acronym>, você pode
                        usar &#039;localhost&#039; ou &#039;127.0.0.1&#039;.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        <em class="emphasis">username</em>:
                        identificador da conta para autenticar uma conexão com o
                        servidor <acronym class="acronym">SGBDR</acronym>.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        <em class="emphasis">password</em>:
                        credencial de senha para autenticar uma
                        conexão com o servidor <acronym class="acronym">SGBDR</acronym>.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        <em class="emphasis">dbname</em>:
                        nome da instância do banco de dados no servidor <acronym class="acronym">SGBDR</acronym>.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        <em class="emphasis">port</em>:
                        alguns servidores <acronym class="acronym">SGBDR</acronym> podem aceitar conexões de rede
                        em um número de porta especificado pelo administrador. O parâmetro port
                        permite que você especifique a porta a qual sua
                        aplicação <acronym class="acronym">PHP</acronym> se conecta, para casar com a porta
                        configurada no servidor <acronym class="acronym">SGBDR</acronym>.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        <em class="emphasis">charset</em>:
                        especifica o conjunto de caracteres usado para a conexão.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        <em class="emphasis">options</em>:
                        este parâmetro é um matriz associativo de opções
                        que são genéricas para todas as classes
                        <span class="classname">Zend_Db_Adapter</span>.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        <em class="emphasis">driver_options</em>:
                        este parâmetro é um matriz associativo de opções
                        adicionais que são específicas para uma dada extensão
                        de banco de dados. Um uso típico deste parâmetro é para
                        configurar atributos de um driver <acronym class="acronym">PDO</acronym>.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        <em class="emphasis">adapterNamespace</em>:
                        nomeia a parte inicial do nome da classe para a
                        adaptadora, em vez de &#039;<span class="classname">Zend_Db_Adapter</span>&#039;. Use isto se
                        você precisar do método  <span class="methodname">factory()</span> para
                        carregar uma classe adaptadora de banco de dados não-Zend.
                    </p>
                </li>
            </ul>

            <div class="example" id="zend.db.adapter.connecting.parameters.example1"><div class="info"><p><b>Example #5 Passando a Opção Case-Folding para a Fábrica</b></p></div>
                

                <div class="example-contents"><p>
                    Você pode especificar essa opção pela constante
                    <b><tt>Zend_Db::CASE_FOLDING</tt></b>. Ela corresponde ao atributo
                    <b><tt>ATTR_CASE</tt></b> nos drivers de banco de dados
                    <acronym class="acronym">PDO</acronym> e <acronym class="acronym">IBM</acronym> <acronym class="acronym">DB2</acronym>,
                    ajustando a caixa das chaves de string nos conjuntos de resultado de consulta.
                    A opção leva os valores <b><tt>Zend_Db::CASE_NATURAL</tt></b> (padrão),
                    <b><tt>Zend_Db::CASE_UPPER</tt></b>, e
                    <b><tt>Zend_Db::CASE_LOWER</tt></b>.
                </p></div>

                <pre class="programlisting brush: php">
$options = array(
    Zend_Db::CASE_FOLDING =&gt; Zend_Db::CASE_UPPER
);

$params = array(
    &#039;host&#039;           =&gt; &#039;127.0.0.1&#039;,
    &#039;username&#039;       =&gt; &#039;webuser&#039;,
    &#039;password&#039;       =&gt; &#039;xxxxxxxx&#039;,
    &#039;dbname&#039;         =&gt; &#039;test&#039;,
    &#039;options&#039;        =&gt; $options
);

$db = Zend_Db::factory(&#039;Db2&#039;, $params);
</pre>

            </div>

            <div class="example" id="zend.db.adapter.connecting.parameters.example2"><div class="info"><p><b>Example #6 Passando a Opção Auto-Quoting para a Fábrica</b></p></div>
                

                <div class="example-contents"><p>
                    Você pode especificar essa opção pela constante
                    <b><tt>Zend_Db::AUTO_QUOTE_IDENTIFIERS</tt></b>. Se o valor
                    é <b><tt>TRUE</tt></b> (padrão), identificadores como nomes de
                    tabela, nomes de coluna, e mesmo apelidos são delimitados em toda
                    sintaxe <acronym class="acronym">SQL</acronym> gerada pelo objeto adaptador. Isso torna simples
                    usar identificadores que contêm palavras-chave <acronym class="acronym">SQL</acronym>, ou
                    caracteres especiais. Se o valor é <b><tt>FALSE</tt></b>,
                    identificadores não são delimitados automaticamente. Se você precisa
                    delimitar identificadores, você deve fazer por conta própria usando
                    o método  <span class="methodname">quoteIdentifier()</span>.
                </p></div>

                <pre class="programlisting brush: php">
$options = array(
    Zend_Db::AUTO_QUOTE_IDENTIFIERS =&gt; false
);

$params = array(
    &#039;host&#039;           =&gt; &#039;127.0.0.1&#039;,
    &#039;username&#039;       =&gt; &#039;webuser&#039;,
    &#039;password&#039;       =&gt; &#039;xxxxxxxx&#039;,
    &#039;dbname&#039;         =&gt; &#039;test&#039;,
    &#039;options&#039;        =&gt; $options
);

$db = Zend_Db::factory(&#039;Pdo_Mysql&#039;, $params);
</pre>

            </div>

            <div class="example" id="zend.db.adapter.connecting.parameters.example3"><div class="info"><p><b>Example #7 Passando Opções de Driver PDO para a Fábrica</b></p></div>
                

                <pre class="programlisting brush: php">
$pdoParams = array(
    PDO::MYSQL_ATTR_USE_BUFFERED_QUERY =&gt; true
);

$params = array(
    &#039;host&#039;           =&gt; &#039;127.0.0.1&#039;,
    &#039;username&#039;       =&gt; &#039;webuser&#039;,
    &#039;password&#039;       =&gt; &#039;xxxxxxxx&#039;,
    &#039;dbname&#039;         =&gt; &#039;test&#039;,
    &#039;driver_options&#039; =&gt; $pdoParams
);

$db = Zend_Db::factory(&#039;Pdo_Mysql&#039;, $params);

echo $db-&gt;getConnection()
        -&gt;getAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY);
</pre>

            </div>

            <div class="example" id="zend.db.adapter.connecting.parameters.example4"><div class="info"><p><b>Example #8 Passando Opções de Serialização para a Fábrica</b></p></div>
                

                <pre class="programlisting brush: php">
$options = array(
    Zend_Db::ALLOW_SERIALIZATION =&gt; false
);

$params = array(
    &#039;host&#039;           =&gt; &#039;127.0.0.1&#039;,
    &#039;username&#039;       =&gt; &#039;webuser&#039;,
    &#039;password&#039;       =&gt; &#039;xxxxxxxx&#039;,
    &#039;dbname&#039;         =&gt; &#039;test&#039;,
    &#039;options&#039;        =&gt; $options
);

$db = Zend_Db::factory(&#039;Pdo_Mysql&#039;, $params);
</pre>

            </div>
        </div>

        <div class="section" id="zend.db.adapter.connecting.getconnection"><div class="info"><h1 class="title">Gerenciando Conexões Preguiçosas</h1></div>
            

            <p class="para">
                Criar uma instância de uma classe adaptadora não abre uma conexão
                com o servidor <acronym class="acronym">SGBDR</acronym> imediatamente. A adaptadora guarda os
                parâmetros de conexão, e a estabelece por demanda, na primeira
                vez que você precisar executar uma consulta. Isso garante que
                criar um objeto adaptador é rápido é barato. Você pode
                criar uma instância de uma adaptadora mesmo se não estiver certo
                que precisa rodar quaisquer consultas de banco de dados durante a requisição
                atual que sua aplicação está servindo.
            </p>

            <p class="para">
                Se você precisa forçar a adaptador a se conectar ao <acronym class="acronym">SGBDR</acronym>, use
                o método  <span class="methodname">getConnection()</span>. Esse método retorna
                um objeto para a conexão como representado pela respectiva
                extensão de banco de dados <acronym class="acronym">PHP</acronym>. Por exemplo, se você usar
                qualquer uma das classes adaptadoras para drivers <acronym class="acronym">PDO</acronym>, então
                 <span class="methodname">getConnection()</span> retorna o objeto <acronym class="acronym">PDO</acronym>,
                depois de iniciá-lo como uma conexão ativa para o banco de dados especificado.
            </p>

            <p class="para">
                Pode ser útil forçar a conexão se você quer capturar
                quaisquer exceções que ela lançar como resultado de credenciais de conta
                inválidas, ou outra falha ao conectar-se ao servidor <acronym class="acronym">SGBDR</acronym>.
                Essas exceções não são lançadas até que a conexão seja feita,
                assim isso pode ajudar a simplificar o código de sua aplicação se você manipular as
                exceções em um lugar, em vez de fazê-lo
                na primeira consulta ao banco de dados.
            </p>

            <p class="para">
                Adicionalmente, uma adaptadora pode ser serializada para armazená-la, por exemplo,
                em uma variável de sessão. Isso pode ser muito útil não somente para a
                própria adaptadora, mas para outros objetos que a agreguem, como um
                objeto <span class="classname">Zend_Db_Select</span>. Por padrão, adaptadoras têm permissão
                de serem serializadas, se você não quiser isso, deve considerar passar a
                opção <b><tt>Zend_Db::ALLOW_SERIALIZATION</tt></b> com
                <b><tt>FALSE</tt></b>, veja o exemplo abaixo. Em respeito ao princípio de
                conexões preguiçosas, a adaptadora não reconectará a si própria depois de ser
                revertida sua serialização. Você deve então chamar
                 <span class="methodname">getConnection()</span> por conta própria. Você pode fazer a
                adaptadora se autorreconectar pela passagem de
                <b><tt>Zend_Db::AUTO_RECONNECT_ON_UNSERIALIZE</tt></b> com
                <b><tt>TRUE</tt></b> como uma opção da adaptadora.
            </p>

            <div class="example" id="zend.db.adapter.connecting.getconnection.example"><div class="info"><p><b>Example #9 Manipulando Exceções de Conexão</b></p></div>
                

                <pre class="programlisting brush: php">
try {
    $db = Zend_Db::factory(&#039;Pdo_Mysql&#039;, $parameters);
    $db-&gt;getConnection();
} catch (Zend_Db_Adapter_Exception $e) {
    // talvez uma credencial de login falhou, ou talvez o SGBDR não está rodando
} catch (Zend_Exception $e) {
    // talvez factory() falhou em carregar a classe adaptadora especificada
}
</pre>

            </div>
        </div>
    </div>

    <div class="section" id="zend.db.adapter.example-database"><div class="info"><h1 class="title">Banco de Dados de Exemplo</h1></div>
        

        <p class="para">
            Na documentação para classes <span class="classname">Zend_Db</span>, nós usamos um conjunto de
            tabelas simples para ilustrar o uso de classes e métodos. Estas
            tabelas de exemplo podem armazenar informações sobre rastreamento de bugs em um
            projeto de desenvolvimento de software. O banco de dados contém quatro tabelas:
        </p>

        <ul class="itemizedlist">
            <li class="listitem">
                <p class="para">
                    <em class="emphasis">accounts</em> armazena
                    informação sobre cada usuário do banco de dados de rastreamento de bugs.
                </p>
            </li>

            <li class="listitem">
                <p class="para">
                    <em class="emphasis">products</em> armazena
                    informação sobre cada produto para o qual um bug pode ser
                    registrado.
                </p>
            </li>

            <li class="listitem">
                <p class="para">
                    <em class="emphasis">bugs</em> armazena informação
                    sobre bugs, incluindo o estado atual do bug, a
                    pessoa que o reportou, a pessoa que se encarregou de
                    corrigí-lo e a pessoa que se encarregou de verificar a
                    correção.
                </p>
            </li>

            <li class="listitem">
                <p class="para">
                    <em class="emphasis">bugs_products</em> armazena um
                    relacionamento entre bugs e produtos. Ela implementa um
                    relacionamento muitos-para-muitos, porque para um dado bug pode ter
                    relevância para múltiplos produtos, e, obviamente, um dado
                    produto pode ter múltiplos bugs.
                </p>
            </li>
        </ul>

        <p class="para">
            O seguinte pseudocódigo de linguagem de definição de dados <acronym class="acronym">SQL</acronym>
            descreve as tabelas neste banco de dados de exemplo. Estas tabelas de exemplo são
            extensivamente usadas pelos testes unitários automatizados de
            <span class="classname">Zend_Db</span>.
        </p>

        <pre class="programlisting brush: sql">
CREATE TABLE accounts (
  account_name      VARCHAR(100) NOT NULL PRIMARY KEY
);

CREATE TABLE products (
  product_id        INTEGER NOT NULL PRIMARY KEY,
  product_name      VARCHAR(100)
);

CREATE TABLE bugs (
  bug_id            INTEGER NOT NULL PRIMARY KEY,
  bug_description   VARCHAR(100),
  bug_status        VARCHAR(20),
  reported_by       VARCHAR(100) REFERENCES accounts(account_name),
  assigned_to       VARCHAR(100) REFERENCES accounts(account_name),
  verified_by       VARCHAR(100) REFERENCES accounts(account_name)
);

CREATE TABLE bugs_products (
  bug_id            INTEGER NOT NULL REFERENCES bugs,
  product_id        INTEGER NOT NULL REFERENCES products,
  PRIMARY KEY       (bug_id, product_id)
);
</pre>


        <p class="para">
            Note também que a tabela &#039;bugs&#039; contém múltiplas referências de chave estrangeira para a
            tabela &#039;accounts&#039;. Cada uma das chaves estrangeiras pode referenciar uma linha diferente
            na tabela &#039;accounts&#039; para um dado bug.
        </p>

        <p class="para">
            O diagrama abaixo ilustra o modelo físico de dados do banco de dados de exemplo.
        </p>

        <p class="para">
            <div class="inlinemediaobject"><div class="imageobject"><img src="images/d481d625821a97b9a5eb2cec99dca50e-zend.db.adapter.example-database.png" alt="zend.db.adapter.example-database.png" width="387" height="302" /></div></div>
        </p>
    </div>

    <div class="section" id="zend.db.adapter.select"><div class="info"><h1 class="title">Lendo Resultados de Consulta</h1></div>
        

        <p class="para">
            Esta seção descreve métodos da classe adaptadora com os quais você
            pode rodar consultas <acronym class="acronym">SELECT</acronym> e recuperar seus resultados.
        </p>

        <div class="section" id="zend.db.adapter.select.fetchall"><div class="info"><h1 class="title">Buscando um Conjunto Completo de Resultados</h1></div>
            

            <p class="para">
                Você pode rodar uma consulta <acronym class="acronym">SQL</acronym> <acronym class="acronym">SELECT</acronym> e
                recuperar seus resultados em um passo usando o método
                 <span class="methodname">fetchAll()</span>.
            </p>

            <p class="para">
                O primeiro argumento para este método é uma string contendo uma
                declaração <acronym class="acronym">SELECT</acronym>. Como alternativa, o primeiro argumento pode
                ser um objeto da classe <a href="zend.db.select.html" class="link">Zend_Db_Select</a>.
                A classe adaptadora converte automaticamente esse objeto em uma representação de
                string da declaração <acronym class="acronym">SELECT</acronym>.
            </p>

            <p class="para">
                O segundo argumento para  <span class="methodname">fetchAll()</span> é um matriz de
                valores para substituir por curingas de parâmetro na declaração
                <acronym class="acronym">SQL</acronym>.
            </p>

            <div class="example" id="zend.db.adapter.select.fetchall.example"><div class="info"><p><b>Example #10 Usando fetchAll()</b></p></div>
                

                <pre class="programlisting brush: php">
$sql = &#039;SELECT * FROM bugs WHERE bug_id = ?&#039;;

$result = $db-&gt;fetchAll($sql, 2);
</pre>

            </div>
        </div>

        <div class="section" id="zend.db.adapter.select.fetch-mode"><div class="info"><h1 class="title">Alterando o Modo de Busca</h1></div>
            

            <p class="para">
                Por padrão,  <span class="methodname">fetchAll()</span> retorna um matriz de
                linhas, cada uma das quais é um matriz associativo. As chaves do
                matriz associativo são as colunas ou apelidos de coluna dados
                na consulta de seleção.
            </p>

            <p class="para">
                Você pode especificar um estilo diferente de resultados de busca usando o
                método  <span class="methodname">setFetchMode()</span>. Os modos suportados são
                identificados por constantes:
            </p>

            <ul class="itemizedlist">
                <li class="listitem">
                    <p class="para">
                        <em class="emphasis"><b><tt>Zend_Db::FETCH_ASSOC</tt></b></em>:
                        retorna dados em um matriz de matrizs associativos.
                        As chaves de matriz são nomes de coluna, como strings. Este é o modo padrão
                        de busca para classes <span class="classname">Zend_Db_Adapter</span>.
                    </p>

                    <p class="para">
                        Note que se sua lista de seleção contém mais de uma
                        coluna com o mesmo nome, por exemplo se elas são de
                        duas tabelas diferentes em um <acronym class="acronym">JOIN</acronym>, pode haver somente
                        uma entrada na matriz associativa para o nome dado.
                        Se você usa o modo <b><tt>FETCH_ASSOC</tt></b>, deve especificar
                        apelidos de coluna em sua consulta <acronym class="acronym">SELECT</acronym> para garantir
                        que os nomes resultem em chaves de matriz únicas.
                    </p>

                    <p class="para">
                        Por padrão, essas strings são devolvidas como foram
                        devolvidas pelo driver de banco de dados. Isso é tipicamente
                        a leitura da coluna no servidor <acronym class="acronym">SGBDR</acronym>. Você pode
                        especificar a caixa para essas strings, usando a
                        opção <b><tt>Zend_Db::CASE_FOLDING</tt></b>.
                        Especifique isso quando instanciar a adaptadora.
                        Veja <a href="zend.db.adapter.html#zend.db.adapter.connecting.parameters.example1" class="link">este
                            exemplo</a>.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        <em class="emphasis"><b><tt>Zend_Db::FETCH_NUM</tt></b></em>:
                        retorna dados em um matriz de matrizs. Os matrizs são
                        indexados por inteiros, correspondendo à posição do
                        respectivo campo na lista de seleção da consulta.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        <em class="emphasis"><b><tt>Zend_Db::FETCH_BOTH</tt></b></em>:
                        retorna dados em um matriz de matrizs. As chaves de matriz são
                        tanto strings como as usadas no modo <b><tt>FETCH_ASSOC</tt></b>, como
                        inteiros como os usados no modo <b><tt>FETCH_NUM</tt></b>. Note que o
                        número de elementos na matriz é o dobro do que seria se você usasse
                        <b><tt>FETCH_ASSOC</tt></b> ou <b><tt>FETCH_NUM</tt></b>.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        <em class="emphasis"><b><tt>Zend_Db::FETCH_COLUMN</tt></b></em>:
                        retorna dados em um matriz de valores. O valor em cada matriz
                        é o valor retornado pela coluna do conjunto de resultados.
                        Por padrão, essa é a primeira coluna, indexada por 0.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        <em class="emphasis"><b><tt>Zend_Db::FETCH_OBJ</tt></b></em>:
                        retorna dados em um matriz de objetos. A classe padrão
                        é a classe interna <acronym class="acronym">PHP</acronym> stdClass. Colunas do conjunto de
                        resultados estão disponíveis como propriedades públicas do
                        objeto.
                    </p>
                </li>
            </ul>

            <div class="example" id="zend.db.adapter.select.fetch-mode.example"><div class="info"><p><b>Example #11 Usando setFetchMode()</b></p></div>
                

                <pre class="programlisting brush: php">
$db-&gt;setFetchMode(Zend_Db::FETCH_OBJ);

$result = $db-&gt;fetchAll(&#039;SELECT * FROM bugs WHERE bug_id = ?&#039;, 2);

// $result é um matriz de objetos
echo $result[0]-&gt;bug_description;
</pre>

            </div>
        </div>

        <div class="section" id="zend.db.adapter.select.fetchassoc"><div class="info"><h1 class="title">Buscando um Conjunto de Resultados como um matriz Associativo</h1></div>
            

            <p class="para">
                O método  <span class="methodname">fetchAssoc()</span> retorna dados em uma matriz
                de matrizes associativas, independente de qual valor você tenha configurado
                para o modo de busca, utilizando a primeira coluna como índice da matriz.
            </p>

            <div class="example" id="zend.db.adapter.select.fetchassoc.example"><div class="info"><p><b>Example #12 Usando fetchAssoc()</b></p></div>
                

                <pre class="programlisting brush: php">
$db-&gt;setFetchMode(Zend_Db::FETCH_OBJ);

$result = $db-&gt;fetchAssoc(
    &#039;SELECT bug_id, bug_description, bug_status FROM bugs&#039;
);

// $result é uma matriz de matrizes associativas, conforme o modo de busca
echo $result[2][&#039;bug_description&#039;]; // Descrição do Bug #2
echo $result[1][&#039;bug_description&#039;]; // Descrição do Bug #1
</pre>

            </div>
        </div>

        <div class="section" id="zend.db.adapter.select.fetchcol"><div class="info"><h1 class="title">Buscando uma Única Coluna a partir de um Conjunto de Resultados</h1></div>
            

            <p class="para">
                O método  <span class="methodname">fetchCol()</span> retorna dados em um matriz
                de valores, independente do valor que você tenha configurado para o modo de busca
                Ele devolve somente a primeira coluna devolvida pela consulta.
                Quaisquer outras colunas devolvidas pela consulta são descartadas.
                Se você precisar devolver uma outra coluna que não seja a primeira, veja
                <a href="zend.db.statement.html#zend.db.statement.fetching.fetchcolumn" class="link">esta seção</a>.
            </p>

            <div class="example" id="zend.db.adapter.select.fetchcol.example"><div class="info"><p><b>Example #13 Usando fetchCol()</b></p></div>
                

                <pre class="programlisting brush: php">
$db-&gt;setFetchMode(Zend_Db::FETCH_OBJ);

$result = $db-&gt;fetchCol(
    &#039;SELECT bug_description, bug_id FROM bugs WHERE bug_id = ?&#039;, 2);

// contém bug_description; bug_id não é devolvida
echo $result[0];
</pre>

            </div>
        </div>

        <div class="section" id="zend.db.adapter.select.fetchpairs"><div class="info"><h1 class="title">Buscando Pares Chave-Valor a partir de um Conjunto de Resultados</h1></div>
            

            <p class="para">
                O método  <span class="methodname">fetchPairs()</span> retorna dados em um matriz
                de pares chave-valor, como um matriz associativo com uma entrada única
                por linha. A chave desse matriz associativo é tomada da
                primeira coluna devolvida pela consulta <acronym class="acronym">SELECT</acronym>. O valor é tomado
                da segunda coluna devolvida pela consulta <acronym class="acronym">SELECT</acronym>. Quaisquer
                outras colunas devolvidas pela consulta são descartadas.
            </p>

            <p class="para">
                Você deve projetar a conuslta <acronym class="acronym">SELECT</acronym> de modo que a primeira
                coluna devolvida tenha valores únicos. Se há valores duplicados na
                primeira coluna, entradas na matriz associativo serão
                sobrescritas.
            </p>

            <div class="example" id="zend.db.adapter.select.fetchpairs.example"><div class="info"><p><b>Example #14 Usando fetchPairs()</b></p></div>
                

                <pre class="programlisting brush: php">
$db-&gt;setFetchMode(Zend_Db::FETCH_OBJ);

$result = $db-&gt;fetchPairs(&#039;SELECT bug_id, bug_status FROM bugs&#039;);

echo $result[2];
</pre>

            </div>
        </div>

        <div class="section" id="zend.db.adapter.select.fetchrow"><div class="info"><h1 class="title">Buscando uma Linha Única a partir de um Conjunto de Resultados</h1></div>
            

            <p class="para">
                O método  <span class="methodname">fetchRow()</span> retorna dados usando o
                modo de busca atual, mas retorna somente a primeira linha
                buscada a partir do conjunto de resultados.
            </p>

            <div class="example" id="zend.db.adapter.select.fetchrow.example"><div class="info"><p><b>Example #15 Using fetchRow()</b></p></div>
                

                <pre class="programlisting brush: php">
$db-&gt;setFetchMode(Zend_Db::FETCH_OBJ);

$result = $db-&gt;fetchRow(&#039;SELECT * FROM bugs WHERE bug_id = 2&#039;);

// note que $result é um único objeto, não um matriz de objetos
echo $result-&gt;bug_description;
</pre>

            </div>
        </div>

        <div class="section" id="zend.db.adapter.select.fetchone"><div class="info"><h1 class="title">Buscando um Escalar Único a partir de um Conjunto de Resultados</h1></div>
            

            <p class="para">
                O método  <span class="methodname">fetchOne()</span> é como uma combinação
                do método  <span class="methodname">fetchRow()</span> com o método
                 <span class="methodname">fetchCol()</span>, no que ele retorna dados somente
                para a primeira linha buscada a partir do conjunto de resultados, e retorna
                somente o valor da primeira coluna naquela linha. Portanto ele retorna somente
                um único valor escalar, nem um matriz nem um objeto.
            </p>

            <div class="example" id="zend.db.adapter.select.fetchone.example"><div class="info"><p><b>Example #16 Usando fetchOne()</b></p></div>
                

                <pre class="programlisting brush: php">
$result = $db-&gt;fetchOne(&#039;SELECT bug_status FROM bugs WHERE bug_id = 2&#039;);

// este é um valor string único
echo $result;
</pre>

            </div>
        </div>
    </div>

    <div class="section" id="zend.db.adapter.write"><div class="info"><h1 class="title">Gravando Mudanças no Banco de Dados</h1></div>
        

        <p class="para">
            Você pode usar a classe adaptadora para gravar novos dados ou alterar
            dados existentes em seu banco de dados. Esta seção descreve métodos para fazer essas
            operações.
        </p>

        <div class="section" id="zend.db.adapter.write.insert"><div class="info"><h1 class="title">Incluindo Dados</h1></div>
            

            <p class="para">
                Você pode adicionar novas linhas em uma tabela de seu banco de dados usando
                o método  <span class="methodname">insert()</span>. O primeiro argumento é uma string
                que denomina a tabela, e o segundo argumento é um matriz
                associativo, mapeando nomes de coluna para valores de dados.
            </p>

            <div class="example" id="zend.db.adapter.write.insert.example"><div class="info"><p><b>Example #17 Incluindo em uma Tabela</b></p></div>
                

                <pre class="programlisting brush: php">
$data = array(
    &#039;created_on&#039;      =&gt; &#039;2007-03-22&#039;,
    &#039;bug_description&#039; =&gt; &#039;Something wrong&#039;,
    &#039;bug_status&#039;      =&gt; &#039;NEW&#039;
);

$db-&gt;insert(&#039;bugs&#039;, $data);
</pre>

            </div>

            <p class="para">
                Colunas que você excluir da matriz de dados não serão especificadas para
                o banco de dados. Portanto, elas seguem as mesmas regras que uma
                declaração <acronym class="acronym">SQL</acronym> <acronym class="acronym">INSERT</acronym> segue: se a coluna
                tem uma cláusula <acronym class="acronym">DEFAULT</acronym>, a coluna leva o valor na linha
                criada, caso contrário é deixado em um estado <b><tt>NULL</tt></b>.
            </p>

            <p class="para">
                Por padrão, os valores em seu matriz de dados são incluídos usando
                parâmetros. ISso reduz o risco de alguns tipos de problemas de
                segurança. Você não precisa aplicar escaping ou quoting para valores
                na matriz de dados.
            </p>

            <p class="para">
                Você pode precisar que valores na matriz de dados sejam tratados como expressões
                <acronym class="acronym">SQL</acronym>, caso no qual elas não devam sofrer quoting. Por
                padrão, todos os valores de dados passados como strings são tratados como
                literais string. Para especificar que o valor é uma expressão
                <acronym class="acronym">SQL</acronym> e portanto não deve sofrer quoting, passe o valor
                na matriz de dados como um objeto do tipo <span class="classname">Zend_Db_Expr</span>
                em vez de texto claro.
            </p>

            <div class="example" id="zend.db.adapter.write.insert.example2"><div class="info"><p><b>Example #18 Incluindo Expressões em uma Tabela</b></p></div>
                

                <pre class="programlisting brush: php">
$data = array(
    &#039;created_on&#039;      =&gt; new Zend_Db_Expr(&#039;CURDATE()&#039;),
    &#039;bug_description&#039; =&gt; &#039;Something wrong&#039;,
    &#039;bug_status&#039;      =&gt; &#039;NEW&#039;
);

$db-&gt;insert(&#039;bugs&#039;, $data);
</pre>

            </div>
        </div>

        <div class="section" id="zend.db.adapter.write.lastinsertid"><div class="info"><h1 class="title">Recuperando um Valor Gerado</h1></div>
            

            <p class="para">
                Algumas marcas de <acronym class="acronym">SGBDR</acronym> suportam autoincremento de chaves
                primárias. Uma tabela definida desse modo gera um valor de chave primária
                automaticamente durante um <acronym class="acronym">INSERT</acronym> de uma nova linha. O valor de
                retorno do método  <span class="methodname">insert()</span> <em class="emphasis">não</em> é
                o último ID incluído, porque a tabela pode não ter uma
                coluna de autoincremento. Em vez disso, o valor de retorno é o
                número de linhas afetadas (geralmente 1).
            </p>

            <p class="para">
                Se sua tabela é definida com uma chave primária de autoincremento
                você pode chamar o método  <span class="methodname">lastInsertId()</span> depois da
                inclusão. Esse método retonra o último valor gerado no
                escopo da conexão atual com o banco de dados.
            </p>

            <div class="example" id="zend.db.adapter.write.lastinsertid.example-1"><div class="info"><p><b>Example #19 Usando lastInsertId() para uma Chave de Autoincremento</b></p></div>
                

                <pre class="programlisting brush: php">
$db-&gt;insert(&#039;bugs&#039;, $data);

// retorna o último valor gerado por uma coluna de autoincremento
$id = $db-&gt;lastInsertId();
</pre>

            </div>

            <p class="para">
                Algumas marcas de <acronym class="acronym">SGBDR</acronym> suportam um objeto de sequencia, que
                gera valores únicos para servir como valores da chave primária. Para suportar
                sequencias, o método  <span class="methodname">lastInsertId()</span> aceita dois
                argumentos string opcionais. Esses argumentos denominam a tabela e
                a coluna, assumindo que você tenha seguido a convenção de que uma
                sequencias é denominada usando os nomes de tabela e coluna para os quais
                a sequencia gera valores, e um sufixo &quot;_seq&quot;. Isso é
                baseado na convenção usada pelo PostgreSQL quando nomeia
                sequencias para colunas <b><tt>SERIAL</tt></b>. Por exemplo, uma tabela &quot;bugs&quot;
                com a coluna de chave primária &quot;bug_id&quot; usaria uma sequencia denominada
                &quot;bugs_bug_id_seq&quot;.
            </p>

            <div class="example" id="zend.db.adapter.write.lastinsertid.example-2"><div class="info"><p><b>Example #20 Usando lastInsertId() para uma Sequencia</b></p></div>
                

                <pre class="programlisting brush: php">
$db-&gt;insert(&#039;bugs&#039;, $data);

// retorna o último valor gerado pela sequencia &#039;bugs_bug_id_seq&#039;.
$id = $db-&gt;lastInsertId(&#039;bugs&#039;, &#039;bug_id&#039;);

// alternativamente, retorna o último valor gerado pela sequencia &#039;bugs_seq&#039;.
$id = $db-&gt;lastInsertId(&#039;bugs&#039;);
</pre>

            </div>

            <p class="para">
                Se o nome de seu objeto de sequencia não seguir essa convenção
                de nomes, use o método  <span class="methodname">lastSequenceId()</span>
                em seu lugar. Esse método leva um único argumento string, nomeando
                literalmente a sequencia.
            </p>

            <div class="example" id="zend.db.adapter.write.lastinsertid.example-3"><div class="info"><p><b>Example #21 Usando lastSequenceId()</b></p></div>
                

                <pre class="programlisting brush: php">
$db-&gt;insert(&#039;bugs&#039;, $data);

// retorna o último valor gerado pela sequencia &#039;bugs_id_gen&#039;.
$id = $db-&gt;lastSequenceId(&#039;bugs_id_gen&#039;);
</pre>

            </div>

            <p class="para">
                Para as marcas de <acronym class="acronym">SGBDR</acronym> que não suportam sequencias, incluindo
                MariaDB, MySQL, Microsoft <acronym class="acronym">SQL</acronym> Server, e SQLite, os argumentos
                para o método  <span class="methodname">lastInsertId()</span> são ignorados, e o valor
                devolvido é o valor mais recente gerado para qualquer tabela por operações
                <acronym class="acronym">INSERT</acronym> durante a conexão atual. Para essas marcas de
                <acronym class="acronym">SGBDR</acronym>, o método  <span class="methodname">lastSequenceId()</span> sempre
                devolve <b><tt>NULL</tt></b>.
            </p>

            <blockquote class="note"><p><b class="note">Note</b>: <span class="info"><b>Porque Não Usar &quot;SELECT MAX(id) FROM table&quot;?</b><br /></span>
                

                <p class="para">
                    Algumas essa consulta retorna valor de chave primária mais recente
                    incluído em uma tabela. Entretanto, essa técnica
                    não é segura para ser usada em um ambiente onde múltiplos clientes estão
                    incluindo registros no banco de dados. É possível, e
                    portanto pode acontecer eventualmente, que outro
                    cliente inclua outra linha no instante entre a
                    inclusão executada por sua aplicação cliente e sua consulta
                    para o valor de  <span class="methodname">MAX(id)</span>. Assim o valor devolvido
                    não identifica a linha que você incluiu, mas sim a linha
                    incluída por algum outro cliente. Não há um modo de saber
                    quando isso aconteceu.
                </p>

                <p class="para">
                    Usar um modo de isolamento de transação forte tal como
                    &quot;repeatable read&quot; pode mitigar esse risco, mas algumas marcas de
                    <acronym class="acronym">SGBDR</acronym> não suportam o isolamento de transação necessário para
                    isso, ou sua aplicação pode usar um modo de isolamento
                    de transação baixo por projeto.
                </p>

                <p class="para">
                    Além disso, usar uma expressão como &quot;<strong class="command">MAX(id)+1</strong>&quot; para gerar
                    um novo valor para uma chave primária não é seguro, porque dois clientes
                    poderiam fazer esta consulta simultanamente, e em seguida, ambos usariam
                    o mesmo valor calculado para sua próxima operação <acronym class="acronym">INSERT</acronym>.
                </p>

                <p class="para">
                     Todas as marcas de <acronym class="acronym">SGBDR</acronym> fornecem mecanismos para gerar
                    valores únicos e retornar o último valor gerado. Esses
                    mecanismos necessariamente trabalham fora do escopo de
                    isolamento da transação, portanto, não há chance de dois clientes
                    gerarem o mesmo valor, e não há chance de que o
                    valor gerado por um outro cliente possa ser informado à sua
                    conexão de cliente como o último valor gerado.
                </p>
            </p></blockquote>
        </div>

        <div class="section" id="zend.db.adapter.write.update"><div class="info"><h1 class="title">Updating Data</h1></div>
            

            <p class="para">
                Você pode atualizar linhas em uma tabela de banco de dados usando o
                método  <span class="methodname">update()</span> de uma adaptadora. Esse método leva
                três argumentos: o primeiro é o nome da tabela, o
                segundo é um matriz associativo mapeando as colunas a serem alteradas para os novos
                valores a serem atribuídos a essas colunas.
            </p>

            <p class="para">
                Os valores na matriz de dados são tratados como sequências de caracteres.
                Veja <a href="zend.db.adapter.html#zend.db.adapter.write.insert" class="link">esta seção</a>
                para obter informações sobre como utilizar expressões <acronym class="acronym">SQL</acronym> na
                matriz de dados.
            </p>

            <p class="para">
                O terceiro argumento é uma string contendo uma expressão <acronym class="acronym">SQL</acronym>
                que é usada como critério para as linhas a serem alteradas. Os valores
                e identificadores nesse argumento não são citados ou escapados.
                Você é responsável por garantir que o conteúdo dinâmico seja
                interpolados para essa sequência de forma segura.
                Veja <a href="zend.db.adapter.html#zend.db.adapter.quoting" class="link">esta seção</a>
                para métodos que o ajudam a fazer isso.
            </p>

            <p class="para">
                O valor de retorno é o número de linhas afetadas pela operação
                de atualização.
            </p>

            <div class="example" id="zend.db.adapter.write.update.example"><div class="info"><p><b>Example #22 Atualizando Linhas</b></p></div>
                

                <pre class="programlisting brush: php">
$data = array(
    &#039;updated_on&#039;      =&gt; &#039;2007-03-23&#039;,
    &#039;bug_status&#039;      =&gt; &#039;FIXED&#039;
);

$n = $db-&gt;update(&#039;bugs&#039;, $data, &#039;bug_id = 2&#039;);
</pre>

            </div>

            <p class="para">
                Se você omitir o terceiro argumento, então todas as linhas na tabela
                do banco de dados são atualizadas com os valores especificados no matriz de dados.
            </p>

            <p class="para">
                Se você fornecer um matriz de strings como terceiro argumento, essas
                strings são unidas como termos em uma expressão separada
                por operadores <b><tt>AND</tt></b>.
            </p>

            <p class="para">
                Se você fornecer um matriz de matrizs como terceiro argumento, os
                valores serão automaticamente citados dentro das chaves. Esses
                serão então unidos como termos, separados por
                operadores <b><tt>AND</tt></b>.
            </p>

            <div class="example" id="zend.db.adapter.write.update.example-array"><div class="info"><p><b>Example #23 Atualizando Linhas Usando um matriz de Expressões</b></p></div>
                

                <pre class="programlisting brush: php">
$data = array(
    &#039;updated_on&#039;      =&gt; &#039;2007-03-23&#039;,
    &#039;bug_status&#039;      =&gt; &#039;FIXED&#039;
);

$where[] = &quot;reported_by = &#039;goofy&#039;&quot;;
$where[] = &quot;bug_status = &#039;OPEN&#039;&quot;;

$n = $db-&gt;update(&#039;bugs&#039;, $data, $where);

// A SQL resultante é:
//  UPDATE &quot;bugs&quot; SET &quot;update_on&quot; = &#039;2007-03-23&#039;, &quot;bug_status&quot; = &#039;FIXED&#039;
//  WHERE (&quot;reported_by&quot; = &#039;goofy&#039;) AND (&quot;bug_status&quot; = &#039;OPEN&#039;)
</pre>

            </div>

            <div class="example" id="zend.db.adapter.write.update.example-arrayofarrays"><div class="info"><p><b>Example #24 Atualizando Linhas Usando um matriz de matrizs</b></p></div>
                

                <pre class="programlisting brush: php">
$data = array(
    &#039;updated_on&#039;      =&gt; &#039;2007-03-23&#039;,
    &#039;bug_status&#039;      =&gt; &#039;FIXED&#039;
);

$where[&#039;reported_by = ?&#039;] = &#039;goofy&#039;;
$where[&#039;bug_status = ?&#039;]  = &#039;OPEN&#039;;

$n = $db-&gt;update(&#039;bugs&#039;, $data, $where);

// A SQL resultante é:
//  UPDATE &quot;bugs&quot; SET &quot;update_on&quot; = &#039;2007-03-23&#039;, &quot;bug_status&quot; = &#039;FIXED&#039;
//  WHERE (&quot;reported_by&quot; = &#039;goofy&#039;) AND (&quot;bug_status&quot; = &#039;OPEN&#039;)
</pre>

            </div>
        </div>

        <div class="section" id="zend.db.adapter.write.delete"><div class="info"><h1 class="title">Excluindo Dados</h1></div>
            

            <p class="para">
                Você pode excluir linhas de uma tabela de banco de dados usando o
                método  <span class="methodname">delete()</span>methodName&gt;. Esse método leva dois
                argumentos: O primeiro é uma string com o nome da tabela.

            </p>

            <p class="para">
                O segundo argumento é uma string contendo uma expressão <acronym class="acronym">SQL</acronym>
                que é usada como critério para as linhas a eliminar. Os valores
                e identificadores nesse argumento não são citados ou escapado.
                Você é responsável por garantir que o conteúdo dinâmico seja
                interpolado para esta seqüência de forma segura.
                Veja <a href="zend.db.adapter.html#zend.db.adapter.quoting" class="link">esta seção</a>
                para métodos que o ajudam a fazer isso.
            </p>

            <p class="para">
                O valor de retorno é o número de linhas afetadas pela operação
                de exclusão.
            </p>

            <div class="example" id="zend.db.adapter.write.delete.example"><div class="info"><p><b>Example #25 Excluindo Linhas</b></p></div>
                

                <pre class="programlisting brush: php">
$n = $db-&gt;delete(&#039;bugs&#039;, &#039;bug_id = 3&#039;);
</pre>

            </div>

            <p class="para">
                Se você omitir o segundo argumento, o resultado é que todas as linhas na
                tabela do banco de dados são eliminadas.
            </p>

            <p class="para">
                Se você fornecer um matriz de strings como o segundo argumento, essas
                strings são unidas como termos em uma expressão separada
                por operadores <b><tt>AND</tt></b>.
            </p>

            <p class="para">
                Se você fornecer um matriz de matrizs como segundo argumento, os
                valores serão automaticamente citados dentro das chaves. Esses
                serão então unidos como termos, separados por
                operadores <b><tt>AND</tt></b>.
            </p>
        </div>
    </div>

    <div class="section" id="zend.db.adapter.quoting"><div class="info"><h1 class="title">Citando Valores e Identificadores</h1></div>
        

        <p class="para">
            Quando você monta consultas <acronym class="acronym">SQL</acronym>, muitas vezes é o caso de você
            precisar incluir os valores de variáveis<acronym class="acronym">PHP</acronym> em expressões
            <acronym class="acronym">SQL</acronym>. Isso é arriscado, porque se o valor em uma string
            <acronym class="acronym">PHP</acronym> contém certos símbolos, como o símbolo de citação, isso pode
            resultar em <acronym class="acronym">SQL</acronym> inválido. Por exemplo, observe os apóstrofos não
            balanceados na seguinte consulta:
        </p>

        <pre class="programlisting brush: php">
$name = &quot;O&#039;Reilly&quot;;
$sql = &quot;SELECT * FROM bugs WHERE reported_by = &#039;$name&#039;&quot;;

echo $sql;
// SELECT * FROM bugs WHERE reported_by = &#039;O&#039;Reilly&#039;
</pre>


        <p class="para">
            Ainda pior é o risco de tais erros de código possam ser explorados
            deliberadamente por uma pessoa que está tentando manipular a função
            de sua aplicação web. Se eles podem especificar o valor de uma variável
            <acronym class="acronym">PHP</acronym> através do uso de um parâmetro <acronym class="acronym">HTTP</acronym> ou
            outro mecanismo, eles podem ser capazes de fazer suas consultas <acronym class="acronym">SQL</acronym>
            fazerem coisas que você não pretendia que elas fizessem, tais retornar dados para a
            pessoa que não deveria ter o privilégio de lê-los. Essa é uma técnica grave e
            generalizada para violar a segurança do aplicativo, conhecido como &quot;SQL Injection&quot;
            (veja <a href="http://en.wikipedia.org/wiki/SQL_Injection" class="link external">&raquo; 
            http://en.wikipedia.org/wiki/SQL_Injection
            </a>).
        </p>

        <p class="para">
            A classe adaptadora <span class="classname">Zend_Db</span> fornece funções convenientes para
            ajudar a reduzir as vulnerabilidades para ataques de Injeção de <acronym class="acronym">SQL</acronym>
            em seu código <acronym class="acronym">PHP</acronym>. A solução é escapar caracteres especiais tais
            como apóstrofos em valores <acronym class="acronym">PHP</acronym> antes deles serem interpolados em
            suas strings <acronym class="acronym">SQL</acronym>. Isso protege tanto contra manipulação acidental
            quanto deliberada de strings <acronym class="acronym">SQL</acronym> por variáveis
            <acronym class="acronym">PHP</acronym> que contém caracteres especiais.
        </p>

        <div class="section" id="zend.db.adapter.quoting.quote"><div class="info"><h1 class="title">Usando quote()</h1></div>
            

            <p class="para">
                O método  <span class="methodname">quote()</span> aceita um único argumento, um
                valor string escalar. Ele retorna o valor com
                caracteres especiais de uma forma adequada para o <acronym class="acronym">SGBDR</acronym> que você
                está usando, e rodeado por delimitadores de valor de string. O
                delimitador de valor de string padrão <acronym class="acronym">SQL</acronym> é o apóstrofo
                ( &#039;).
            </p>

            <div class="example" id="zend.db.adapter.quoting.quote.example"><div class="info"><p><b>Example #26 Usando quote()</b></p></div>
                

                <pre class="programlisting brush: php">
$name = $db-&gt;quote(&quot;O&#039;Reilly&quot;);
echo $name;
// &#039;O\&#039;Reilly&#039;

$sql = &quot;SELECT * FROM bugs WHERE reported_by = $name&quot;;

echo $sql;
// SELECT * FROM bugs WHERE reported_by = &#039;O\&#039;Reilly&#039;
</pre>

            </div>

            <p class="para">
                Note que o valor de retorno de  <span class="methodname">quote()</span> inclui os
                delimitadores de citação em torno da cadeia. Isso é diferente de
                algumas funções que escapam caracteres especiais, mas não adicionam
                os delimitadores de citação, por exemplo
                <a href="http://www.php.net/mysqli_real_escape_string" class="link external">&raquo; 
                mysql_real_escape_string()
                </a>.
            </p>

            <p class="para">
                Os valores podem precisar ser citados ou não citados de acordo com o
                contexto de tipo de dados <acronym class="acronym">SQL</acronym> em que eles são usados. Por
                exemplo, em algumas marcas de <acronym class="acronym">SGBDR</acronym>, um valor inteiro não deve
                ser citado como uma string se for comparado a uma coluna ou expressão do tipo
                inteiro. Em outras palavras, o código seguinte é um erro em algumas implementações
                <acronym class="acronym">SQL</acronym>, assumindo que <span class="property">intColumn</span> tem um tipo de
                dados <acronym class="acronym">SQL</acronym> <b><tt>INTEGER</tt></b>
            </p>

            <pre class="programlisting brush: php">
SELECT * FROM atable WHERE intColumn = &#039;123&#039;
</pre>


            <p class="para">
                Você pode usar o segundo argumento opcional para o
                método  <span class="methodname">quote()</span> para aplicar citação seletivamente para
                o tipo de dados <acronym class="acronym">SQL</acronym> que você especificar.
            </p>

            <div class="example" id="zend.db.adapter.quoting.quote.example-2"><div class="info"><p><b>Example #27 Usando quote() com um Tipo SQL</b></p></div>
                

                <pre class="programlisting brush: php">
$value = &#039;1234&#039;;
$sql = &#039;SELECT * FROM atable WHERE intColumn = &#039;
     . $db-&gt;quote($value, &#039;INTEGER&#039;);
</pre>

            </div>

            <p class="para">
                Cada classe <span class="classname">Zend_Db_Adapter</span> tem codificada os nomes de
                tipos de dados <acronym class="acronym">SQL</acronym> numéricos para a respectiva marca de
                <acronym class="acronym">SGBDR</acronym>. Você também pode usar as constantes
                <b><tt>Zend_Db::INT_TYPE</tt></b>, <b><tt>Zend_Db::BIGINT_TYPE</tt></b>,
                e <b><tt>Zend_Db::FLOAT_TYPE</tt></b> para escrever código de uma forma mais
                independente de <acronym class="acronym">SGBDR</acronym>.
            </p>

            <p class="para">
                <span class="classname">Zend_Db_Table</span> especifica <acronym class="acronym">SQL</acronym> para
                 <span class="methodname">quote()</span> automaticamente ao gerar
                consultas <acronym class="acronym">SQL</acronym> que referenciam colunas-chave de uma tabela.
            </p>
        </div>

        <div class="section" id="zend.db.adapter.quoting.quote-into"><div class="info"><h1 class="title">Usando quoteInto()</h1></div>
            

            <p class="para">
                O uso mais típico de citação é para interpolar uma variável <acronym class="acronym">PHP</acronym>
                em uma expressão ou declaração <acronym class="acronym">SQL</acronym>. Você pode usar o
                método  <span class="methodname">quoteInto()</span> para fazer isso em uma única etapa.
                Esse método leva dois argumentos: o primeiro argumento é uma string
                contendo um símbolo marcador (?), e o
                segundo argumento é um valor ou variável <acronym class="acronym">PHP</acronym> que deve ser
                substituída pelo marcador.
            </p>

            <p class="para">
                O símbolo marcador é o mesmo símbolo usado por muitas marcas de
                <acronym class="acronym">SGBDR</acronym> para parâmetros posicionais, mas o
                método  <span class="methodname">quoteInto()</span> apenas emula parâmetros de consulta.
                O método simplesmente interpola o valor para a string,
                escapa caracteres especiais, e aplica apóstrofos em torno dele.
                Parâmetros de consulta verdadeiros mantêm a separação entre a string
                <acronym class="acronym">SQL</acronym> e os parâmetros assim que a declaração é analisada no
                servidor <acronym class="acronym">SGBDR</acronym>.
            </p>

            <div class="example" id="zend.db.adapter.quoting.quote-into.example"><div class="info"><p><b>Example #28 Usando quoteInto()</b></p></div>
                

                <pre class="programlisting brush: php">
$sql = $db-&gt;quoteInto(&quot;SELECT * FROM bugs WHERE reported_by = ?&quot;, &quot;O&#039;Reilly&quot;);

echo $sql;
// SELECT * FROM bugs WHERE reported_by = &#039;O\&#039;Reilly&#039;
</pre>

            </div>

            <p class="para">
                Você pode usar o terceiro parâmetro opcional de
                 <span class="methodname">quoteInto()</span> para especificar o tipo de dados
                <acronym class="acronym">SQL</acronym>.
                Tipos de dados numéricos não são citados, e outros tipos são citados.
            </p>

            <div class="example" id="zend.db.adapter.quoting.quote-into.example-2"><div class="info"><p><b>Example #29 Using quoteInto() with a SQL Type</b></p></div>
                

                <pre class="programlisting brush: php">
$sql = $db
    -&gt;quoteInto(&quot;SELECT * FROM bugs WHERE bug_id = ?&quot;, &#039;1234&#039;, &#039;INTEGER&#039;);

echo $sql;
// SELECT * FROM bugs WHERE reported_by = 1234
</pre>

            </div>
        </div>

        <div class="section" id="zend.db.adapter.quoting.quote-identifier"><div class="info"><h1 class="title">Usando quoteIdentifier()</h1></div>
            

            <p class="para">
                Os valores não são a única parte da sintaxe <acronym class="acronym">SQL</acronym> que pode
                precisar ser variável. Se você usar variáveis <acronym class="acronym">PHP</acronym> para nomear
                tabelas, colunas, ou outros identificadores em suas declarações
                <acronym class="acronym">SQL</acronym>, pode ser necessário citar essas strings também. Por padrão,
                identificadores <acronym class="acronym">SQL</acronym> têm regras de sintaxe como
                <acronym class="acronym">PHP</acronym> e a maioria das outras linguagens de programação.
                Por exemplo, os identificadores não devem conter espaços, certas
                pontuações ou caracteres especiais, ou ainda caracteres internacionais.
                Certas palavras também são reservadas para a sintaxe <acronym class="acronym">SQL</acronym>,
                e não devem ser usadas como identificadores.
            </p>

            <p class="para">
                No entanto, <acronym class="acronym">SQL</acronym> tem um recurso chamado
                <em class="emphasis">identificadores delimitados</em>, que permite escolhas mais amplas
                para a grafia de identificadores. Se você colocar um identificador
                <acronym class="acronym">SQL</acronym> no tipo adequado de aspas, pode usar identificadores
                com dados que seriam inválidos sem as aspas. Identificadores delimitados podem
                conter espaços, pontuação, ou caracteres internacionais. Você também pode usar
                palavras reservadas da <acronym class="acronym">SQL</acronym> se colocá-las em identificadores
                delimitados.
            </p>

            <p class="para">
                O método  <span class="methodname">quoteIdentifier()</span> trabalha como
                 <span class="methodname">quote()</span>, mas ele aplica caracteres delimitadores
                de identificador para a string de acordo com o tipo de adaptador que você
                usar. Por exemplo, a <acronym class="acronym">SQL</acronym> padrão usa aspas duplas (&quot;)
                para delimitadores de identificador, e a maioria das marcas de
                <acronym class="acronym">SGBDR</acronym> marcas usam esse símbolo. O MySQL usa crase (`) por
                padrão. O método  <span class="methodname">quoteIdentifier()</span> também escapa
                caracteres especiais dentro do argumento string.
            </p>

            <div class="example" id="zend.db.adapter.quoting.quote-identifier.example"><div class="info"><p><b>Example #30 Usando quoteIdentifier()</b></p></div>
                

                <pre class="programlisting brush: php">
// podemos deter um nome de tabela que é uma palavra reservada SQL
$tableName = $db-&gt;quoteIdentifier(&quot;order&quot;);

$sql = &quot;SELECT * FROM $tableName&quot;;

echo $sql
// SELECT * FROM &quot;order&quot;
</pre>

            </div>

            <p class="para">
                Identificadores delimitados <acronym class="acronym">SQL</acronym> são sensíveis à caixa, ao
                contrário de identificadores não citados. Portanto, se você usar identificadores
                delimitados, você deve usar a ortografia do identificador exatamente como ela é
                armazenada no seu esquema, incluindo a caixa das letras.
            </p>

            <p class="para">
                Na maioria dos casos onde <acronym class="acronym">SQL</acronym> é gerada dentro
                de classes <span class="classname">Zend_Db</span>, o padrão é que todos os identificadores
                sejam delimitados automaticamente. Você pode alterar esse comportamento com a opção
                <b><tt>Zend_Db::AUTO_QUOTE_IDENTIFIERS </tt></b>. Especifique essa opção
                ao instanciar o adaptador.
                Veja <a href="zend.db.adapter.html#zend.db.adapter.connecting.parameters.example2" class="link">este
                    exemplo</a>.
            </p>
        </div>
    </div>

    <div class="section" id="zend.db.adapter.transactions"><div class="info"><h1 class="title">Controlando Transações de Banco de Dados</h1></div>
        

        <p class="para">
            Bases de dados definem as operações como unidades lógicas de trabalho que podem ser
            confirmadas ou revertidas como uma única mudança, mesmo que operem em várias tabelas.
            Todas as consultas ao banco de dados são executadas no contexto de uma transação, mesmo
            se o driver de banco de dados as gerencia implicitamente. Isso é chamado modo
            <em class="emphasis">auto-commit</em>, no qual o driver de banco cria uma transação para cada
            declaração que você executa, e confirma essa transação após sua declaração
            <acronym class="acronym">SQL</acronym> ser executada. Por padrão, todas as classes adaptadoras
            <span class="classname">Zend_Db</span> operam em modo auto-commit.
        </p>

        <p class="para">
            De forma alternativa, você pode especificar o início e resolução de uma
            transação, e assim controlar quantas consultas <acronym class="acronym">SQL</acronym> estão incluídas
            em um único grupo que é confirmado (ou revertido) como uma única
            transação. Use o método  <span class="methodname">beginTransaction()</span> para
            iniciar uma transação. Posteriormente declarações <acronym class="acronym">SQL</acronym> são executadas
            no contexto da mesma transação, até que você o resolva explicitamente.
        </p>

        <p class="para">
            Para resolver a transação, use o método  <span class="methodname">commit()</span> ou
             <span class="methodname">rollBack()</span>. O método  <span class="methodname">commit()</span>
            altera marcas feitas durante a sua transação como confirmadas, o que
            significa que os efeitos dessas mudanças são mostrados em consultas executadas em
            outras transações.
        </p>

        <p class="para">
            O método  <span class="methodname">rollBack()</span> faz o oposto: ele descarta
            as alterações feitas durante a transação. As mudanças são
            efetivamente desfeitas, e o estado dos dados retorna a como estava
            antes de você começar sua transação. No entanto, a reversão de sua
            transação não tem efeito sobre as mudanças feitas por outras transações
            executadas simultaneamente.
        </p>

        <p class="para">
            Depois de resolver essa operação, <span class="classname">Zend_Db_Adapter</span>
            retorna ao modo auto-commit, até que você chame
             <span class="methodname">beginTransaction()</span> novamente.
        </p>

        <div class="example" id="zend.db.adapter.transactions.example"><div class="info"><p><b>Example #31 Gerenciando uma Transação para Garantir Consistência</b></p></div>
            

            <pre class="programlisting brush: php">
// Inicie uma transação explicitamente.
$db-&gt;beginTransaction();

try {
    // Tenta executar uma ou mais consultas:
    $db-&gt;query(...);
    $db-&gt;query(...);
    $db-&gt;query(...);

    // Se todas tem sucesso, confirma a transação e todas as mudanças
    // são confirmadas de uma vez.
    $db-&gt;commit();

} catch (Exception $e) {
    // Se qualquer uma das consultas falhar e lançar uma exceção
    // nós queremos desfazer a transação inteira, revertendo
    // mudanças feitas na transação, mesmo aquelas que tiveram sucesso
    // Assim todas as mudanças são confirmadas juntas, ou nenhuma é.
    $db-&gt;rollBack();
    echo $e-&gt;getMessage();
}
</pre>

        </div>
    </div>

    <div class="section" id="zend.db.adapter.list-describe"><div class="info"><h1 class="title">Listando e Descrevendo Tabelas</h1></div>
        

        <p class="para">
            O método  <span class="methodname">listTables()</span> retorna uma matriz de strings,
            com os nomes de todas as tabelas do banco de dados atual.
        </p>

        <p class="para">
            O método  <span class="methodname">describeTable()</span> retorna uma matriz associativa
            de metadados sobre uma tabela. Especifique o nome da tabela
            como uma string no primeiro argumento para este método. O segundo
            argumento é opcional, e identifica o esquema no qual a tabela
            existe.
        </p>

        <p class="para">
            As chaves da matriz associativa retornada são os nomes das colunas
            da tabela. O valor correspondente a cada coluna é também uma
            matriz associativa, com as seguintes chaves e valores:
        </p>

        <table id="zend.db.adapter.list-describe.metadata" class="doctable table"><div class="info"><caption><b>Campos de Metadados Devolvidos por describeTable()</b></caption></div>
            

            
                <thead valign="middle">
                    <tr valign="middle">
                        <th>Key</th>
                        <th>Type</th>
                        <th>Description</th>
                    </tr>

                </thead>


                <tbody valign="middle" class="tbody">
                    <tr valign="middle">
                        <td align="left"><b><tt>SCHEMA_NAME</tt></b></td>
                        <td align="left">(string)</td>
                        <td align="left">
                        Nome do esquema do banco de dados no qual essa tabela existe.
                        </td>
                    </tr>


                    <tr valign="middle">
                        <td align="left"><b><tt>TABLE_NAME</tt></b></td>
                        <td align="left">(string)</td>
                        <td align="left">Nome da tabela a qual esta coluna pertence.</td>
                    </tr>


                    <tr valign="middle">
                        <td align="left"><b><tt>COLUMN_NAME</tt></b></td>
                        <td align="left">(string)</td>
                        <td align="left">Nome da coluna.</td>
                    </tr>


                    <tr valign="middle">
                        <td align="left"><b><tt>COLUMN_POSITION</tt></b></td>
                        <td align="left">(integer)</td>
                        <td align="left">Posição ordinal da coluna na tabela.</td>
                    </tr>


                    <tr valign="middle">
                        <td align="left"><b><tt>DATA_TYPE</tt></b></td>
                        <td align="left">(string)</td>
                        <td align="left">Nome do tipo de dados do <acronym class="acronym">SGBDR</acronym> da coluna.</td>
                    </tr>


                    <tr valign="middle">
                        <td align="left"><b><tt>DEFAULT</tt></b></td>
                        <td align="left">(string)</td>
                        <td align="left">Valor padrão para a coluna, se houver.</td>
                    </tr>


                    <tr valign="middle">
                        <td align="left"><b><tt>NULLABLE</tt></b></td>
                        <td align="left">(boolean)</td>

                        <td align="left">
                            <b><tt>TRUE</tt></b> se a coluna aceita <acronym class="acronym">SQL</acronym>
                            <b><tt>NULL</tt></b>&#039;s, <b><tt>FALSE</tt></b> se a
                            coluna tem uma restrição <b><tt>NOT</tt></b>
                            <b><tt>NULL</tt></b>.
                        </td>
                    </tr>


                    <tr valign="middle">
                        <td align="left"><b><tt>LENGTH</tt></b></td>
                        <td align="left">(integer)</td>

                        <td align="left">
                            Comprimento ou tamanho da coluna como informado pelo
                            <acronym class="acronym">SGBDR</acronym>.
                        </td>
                    </tr>


                    <tr valign="middle">
                        <td align="left"><b><tt>SCALE</tt></b></td>
                        <td align="left">(integer)</td>

                        <td align="left">
                            Escala de tipo <acronym class="acronym">SQL</acronym> <b><tt>NUMERIC</tt></b> ou
                            <b><tt>DECIMAL</tt></b>.
                        </td>
                    </tr>


                    <tr valign="middle">
                        <td align="left"><b><tt>PRECISION</tt></b></td>
                        <td align="left">(integer)</td>

                        <td align="left">
                            Precisão de tipo <acronym class="acronym">SQL</acronym> <b><tt>NUMERIC</tt></b> ou
                            <b><tt>DECIMAL</tt></b>.
                        </td>
                    </tr>


                    <tr valign="middle">
                        <td align="left"><b><tt>UNSIGNED</tt></b></td>
                        <td align="left">(boolean)</td>

                        <td align="left">
                            <b><tt>TRUE</tt></b> se um tipo baseado em inteiro for informado
                            como <b><tt>UNSIGNED</tt></b>.
                        </td>
                    </tr>


                    <tr valign="middle">
                        <td align="left"><b><tt>PRIMARY</tt></b></td>
                        <td align="left">(boolean)</td>

                        <td align="left">
                            <b><tt>TRUE</tt></b> se a coluna é parte da chave primária dessa
                            tabela.
                        </td>
                    </tr>


                    <tr valign="middle">
                        <td align="left"><b><tt>PRIMARY_POSITION</tt></b></td>
                        <td align="left">(integer)</td>
                        <td align="left">Posição ordinal (baseada em 1) da coluna na chave primária.</td>
                    </tr>


                    <tr valign="middle">
                        <td align="left"><b><tt>IDENTITY</tt></b></td>
                        <td align="left">(boolean)</td>

                        <td align="left">
                            <b><tt>TRUE</tt></b> se a coluna usa um valor autogerado.
                        </td>
                    </tr>

                </tbody>
            
        </table>


        <blockquote class="note"><p><b class="note">Note</b>: <span class="info"><b>Como o Campo de Metadados IDENTITY Relaciona-se com SGBDRs Específicos</b><br /></span>
            

            <p class="para">
                O campo de metadados <b><tt>IDENTITY</tt></b> foi escolhido como um termo
                &#039;idiomático&#039; para representar uma relação de chaves substitutas. Este campo pode ser
                vulgarmente conhecido pelos seguintes valores: --
            </p>

            <ul class="itemizedlist">
                <li class="listitem">
                    <p class="para">
                        <b><tt>IDENTITY</tt></b> - <acronym class="acronym">DB2</acronym>,
                        <acronym class="acronym">MSSQL</acronym>
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        <b><tt>AUTO_INCREMENT</tt></b> - MySQL/MariaDB
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        <b><tt>SERIAL</tt></b> - PostgreSQL
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        <b><tt>SEQUENCE</tt></b> - Oracle
                    </p>
                </li>
            </ul>
        </p></blockquote>

        <p class="para">
            Se não houver nenhum tabela que se encaixe com o nome da tabela e nome de esquema
            opcional especificado, então  <span class="methodname">describeTable()</span> retorna uma
            matriz vazia.
        </p>
    </div>

    <div class="section" id="zend.db.adapter.closing"><div class="info"><h1 class="title">Fechando uma Conexão</h1></div>
        

        <p class="para">
            Normalmente não é necessário fechar uma conexão de dados. <acronym class="acronym">PHP</acronym>
            limpa automaticamente todos os recursos ao final de uma requisição.
            Extensões de Banco de Dados são projetadas para fechar a conexão assim que a
            referência para o objeto do recurso é eliminada.
        </p>

        <p class="para">
            No entanto, se você tem um script de longa duração <acronym class="acronym">PHP</acronym> que inicia
            muitas conexões de banco de dados, talvez seja necessário encerrar a conexão, para
            evitar um esgotamento da capacidade de seu servidor <acronym class="acronym">SGBDR</acronym>. Você pode
            usar o método  <span class="methodname">closeConnection()</span> da classe adaptadora fechar
            explicitamente a conexão de dados subjacente.
        </p>

        <p class="para">
            Desde a versão 1.7.2, você pode verificar se está conectado ao
            servidor <acronym class="acronym">SGBDR</acronym> com o método  <span class="methodname">isConnected()</span>.
            Isso significa que um recurso de conexão foi iniciado e não foi fechado. Essa
            função não é atualmente capaz de testar, por exemplo, um fechamento do lado servidor
            da conexão. Ela é usada internamente para fechar a conexão. Isso permite que você feche
            a conexão várias vezes sem erros. Já era o caso antes de 1.7.2 para adaptadores
            <acronym class="acronym">PDO</acronym>, mas não para os outros.
        </p>

        <div class="example" id="zend.db.adapter.closing.example"><div class="info"><p><b>Example #32 Fechando uma Conexão com o Banco de Dados</b></p></div>
            

            <pre class="programlisting brush: php">
$db-&gt;closeConnection();
</pre>

        </div>

        <blockquote class="note"><p><b class="note">Note</b>: <span class="info"><b>Zend_Db Suporta Conexões Persistentes?</b><br /></span>
            

            <p class="para">
                Sim, a persistência é suportada através da adição da
                propriedade <span class="property">persistent</span> definida como <b><tt>TRUE</tt></b>
                na configuração (não em driver_configuration) de um adaptador
                em <span class="classname">Zend_Db</span>.
           </p>

            <div class="example" id="zend.db.adapter.connecting.persistence.example"><div class="info"><p><b>Example #33 Usando a Propriedade Persistence com o Adaptador Oracle</b></p></div>
                

                <pre class="programlisting brush: php">
$db = Zend_Db::factory(&#039;Oracle&#039;, array(
    &#039;host&#039;       =&gt; &#039;127.0.0.1&#039;,
    &#039;username&#039;   =&gt; &#039;webuser&#039;,
    &#039;password&#039;   =&gt; &#039;xxxxxxxx&#039;,
    &#039;dbname&#039;     =&gt; &#039;test&#039;,
    &#039;persistent&#039; =&gt; true
));
</pre>

            </div>

            <p class="para">
                Por favor, note que o uso de conexões persistentes pode causar um
                excesso de conexões inativas no servidor <acronym class="acronym">SGBDR</acronym>, o que leva a
                mais problemas do que qualquer ganho de desempenho que você possa obter por
                reduzir a sobrecarga de fazer conexões.
            </p>

            <p class="para">
                Conexões de banco de dados tem estado. Isto é, alguns objetos no
                servidor <acronym class="acronym">SGBDR</acronym> existem no escopo de sessão.
                Exemplos são bloqueios, variáveis de usuário,
                tabelas temporárias, e informações sobre as consultas mais
                recentemente executadas, tais como linhas afetadas e o último
                valor gerado de id. Se você usa conexões persistentes, a sua
                aplicação pode acessar dados inválidos ou privilegiadas que foram
                criado em uma solicitação <acronym class="acronym">PHP</acronym> anterior.
            </p>

            <p class="para">
                Atualmente, apenas Oracle, <acronym class="acronym">DB2</acronym>, e os adaptadores
                <acronym class="acronym">PDO</acronym> (onde especificado pelo <acronym class="acronym">PHP</acronym>) suportam
                persistência em <span class="classname">Zend_Db</span>.
            </p>
        </p></blockquote>
    </div>

    <div class="section" id="zend.db.adapter.other-statements"><div class="info"><h1 class="title">Rodando Outras Declarações de Banco de Dados</h1></div>
        

        <p class="para">
            Pode haver casos em que você precisa acessar o objeto de conexão
            diretamente, como provido pela extensão de banco de dados <acronym class="acronym">PHP</acronym>.
            Algumas dessas extensões podem oferecer recursos que não são cobertos por
            métodos de <span class="classname">Zend_Db_Adapter_Abstract</span>.
        </p>

        <p class="para">
            Por exemplo, todas as declarações <acronym class="acronym">SQL</acronym> rodadas por
            <span class="classname">Zend_Db</span> são preparadas, então executadas. No entanto, algumas
            funções de banco de dados são incompatíveis com declarações preparadas. Instruções
            <b><tt>DDL</tt></b> como <b><tt>CREATE</tt></b> e <b><tt>ALTER</tt></b>
            não podem ser preparadas no MySQL. Além disso, declarações <acronym class="acronym">SQL</acronym> não se
            beneficiam do <a href="http://dev.mysql.com/doc/refman/5.1/en/query-cache-how.html" class="link external">&raquo; MySQL Query
                Cache</a>, antes do MySQL 5.1.17.
        </p>

        <p class="para">
            A maioria das extensões de banco de dados <acronym class="acronym">PHP</acronym> fornecem um método
            para executar declarações <acronym class="acronym">SQL</acronym> sem prepará-los. Por exemplo, em
            <acronym class="acronym">PDO</acronym>, esse método é  <span class="methodname">exec()</span>. Você pode
            acessar o objeto de conexão na extensão <acronym class="acronym">PHP</acronym> diretamente usando
             <span class="methodname">getConnection()</span>.
        </p>

        <div class="example" id="zend.db.adapter.other-statements.example"><div class="info"><p><b>Example #34 Rodando uma Declaração Não Preparada em um Adaptador PDO</b></p></div>
            

            <pre class="programlisting brush: php">
$result = $db-&gt;getConnection()-&gt;exec(&#039;DROP TABLE bugs&#039;);
</pre>

        </div>

        <p class="para">
            A maioria das extensões de banco de dados <acronym class="acronym">PHP</acronym> fornecem um método
            para executar declarações <acronym class="acronym">SQL</acronym> sem prepará-los. Por exemplo, em
            <acronym class="acronym">PDO</acronym>, esse método é  <span class="methodname">exec()</span>. Você pode
            acessar o objeto de conexão na extensão <acronym class="acronym">PHP</acronym> diretamente usando
             <span class="methodname">getConnection()</span>.
        </p>

        <p class="para">
            Em versões futuras de <span class="classname">Zend_Db</span>, haverá oportunidades de
            adicionar pontos de entrada de método para funcionalidades que são comuns às
            extensões de banco de dados <acronym class="acronym">PHP</acronym> suportadas . Isso não afetará
            compatibilidade com versões anteriores.
        </p>
    </div>

    <div class="section" id="zend.db.adapter.server-version"><div class="info"><h1 class="title">Recuperanco a Versão do Servidor</h1></div>
        

        <p class="para">
            Desde a versão 1.7.2, você pode recuperar a versão do servidor no estilo de sintaxe
            <acronym class="acronym">PHP</acronym> para ser capaz de usar
             <span class="methodname">version_compare()</span>. Se a informação não estiver disponível,
            você receberá <b><tt>NULL</tt></b>.
        </p>

        <div class="example" id="zend.db.adapter.server-version.example"><div class="info"><p><b>Example #35 Verificando a versão do servidor antes de rodar uma consulta</b></p></div>
            

            <pre class="programlisting brush: php">
$version = $db-&gt;getServerVersion();
if (!is_null($version)) {
    if (version_compare($version, &#039;5.0.0&#039;, &#039;&gt;=&#039;)) {
        // faz alguma coisa
    } else {
        // faz alguma outra coisa
    }
} else {
    // impossível ler a versão do servidor
}
</pre>

        </div>
    </div>

    <div class="section" id="zend.db.adapter.adapter-notes"><div class="info"><h1 class="title">Notas sobre Adaptadores Específicos</h1></div>
        

        <p class="para">
            Esta seção lista diferenças entre as classes adaptadoras sobre as quais
            você deve ficar atento.
        </p>

        <div class="section" id="zend.db.adapter.adapter-notes.ibm-db2"><div class="info"><h1 class="title">IBM DB2</h1></div>
            

            <ul class="itemizedlist">
                <li class="listitem">
                    <p class="para">
                        Especifique esse adaptador para o método  <span class="methodname">factory()</span>
                        com o nome &#039;Db2&#039;.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        Este adaptador usa a extensão <acronym class="acronym">PHP</acronym>
                        <b><tt>IBM_DB2</tt></b>.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        <acronym class="acronym">IBM</acronym> <acronym class="acronym">DB2</acronym> suporta tanto seqüências
                        quanto chaves de autoincremento. Portanto os argumentos para
                         <span class="methodname">lastInsertId()</span> são opcionais. Se você não fornecer
                        argumentos, o adaptador retorna o último valor gerado para uma chave de
                        autoincremento. Se você fornecer argumentos, o adaptador retorna o último
                        valor gerado pela seqüência nomeada de acordo com a convenção
                        &#039;<em class="emphasis">table</em>_<em class="emphasis">column</em>_seq&#039;.
                    </p>
                </li>
            </ul>
        </div>

        <div class="section" id="zend.db.adapter.adapter-notes.mysqli"><div class="info"><h1 class="title">MySQLi</h1></div>
            

            <ul class="itemizedlist">
                <li class="listitem">
                    <p class="para">
                        Especifique esse adaptador para o método  <span class="methodname">factory()</span>
                        com o nome &#039;Mysqli&#039;.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        Este adaptador utiliza a extensão <acronym class="acronym">PHP</acronym>.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        O MySQL e o MariaDB não suportam sequências, assim
                         <span class="methodname">lastInsertId()</span> ignora seus argumentos e
                        sempre retorna o último valor gerado para uma
                        chave de autoincremento. O método  <span class="methodname">lastSequenceId()</span>
                        retorna <b><tt>NULL</tt></b>.
                    </p>
                </li>
            </ul>
        </div>

        <div class="section" id="zend.db.adapter.adapter-notes.oracle"><div class="info"><h1 class="title">Oracle</h1></div>
            

            <ul class="itemizedlist">
                <li class="listitem">
                    <p class="para">
                        Especifique esse adaptador para o método  <span class="methodname">factory()</span>
                        com o nome de &#039;Oracle&#039;.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        Esse adaptador usa a extensão <acronym class="acronym">PHP</acronym> oci8.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        Oracle não suporta chaves de autoincremento, assim você
                        deve especificar o nome de uma sequência de
                         <span class="methodname">lastInsertId()</span> ou
                         <span class="methodname">lastSequenceId()</span>.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        A extensão da Oracle não suporta parâmetros
                        posicionais. Você deve usar parâmetros nomeados.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        Atualmente, a opção <b><tt>Zend_Db::CASE_FOLDING</tt></b>
                        não é suportada pelo adaptador Oracle. Para utilizar essa
                        opção com a Oracle, você deve usar o adaptador <acronym class="acronym">PDO</acronym>
                        <acronym class="acronym">OCI</acronym>.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        Por padrão, os campos <acronym class="acronym">LOB</acronym> são devolvidos como objetos
                        <acronym class="acronym">OCI</acronym>-Lob. Você pode recuperá-los como string para todas as
                        solicitações, utilizando as opções do driver
                        &#039;<span class="property">lob_as_string</span>&#039; ou para uma solicitação particular,
                        usando  <span class="methodname">setLobAsString(boolean)</span> no adaptador ou na
                        declaração.
                    </p>
                </li>
            </ul>
        </div>

        <div class="section" id="zend.db.adapter.adapter-notes.sqlsrv"><div class="info"><h1 class="title">Microsoft SQL Server</h1></div>
            

            <ul class="itemizedlist">
                <li class="listitem">
                    <p class="para">
                        Especifique esse adaptador para o método  <span class="methodname">factory()</span>
                        com o nome &#039;Sqlsrv&#039;.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        Esse adaptador usa a extensão <acronym class="acronym">PHP</acronym> sqlsrv.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        Somente o Microsoft <acronym class="acronym">SQL</acronym> Server 2005 ou superior é
                        suportado.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        Microsoft <acronym class="acronym">SQL</acronym> Server não suporta sequências, assim
                         <span class="methodname">lastInsertId()</span> ignora o argumento de chave
                        primária e retorna o último valor gerado para uma chave de autoincremento
                        se um nome de tabela for especificado ou o último id retornado por uma
                        consulta de inserção. O método  <span class="methodname">lastSequenceId()</span>
                        retorna <b><tt>NULL</tt></b>.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        <span class="classname">Zend_Db_Adapter_Sqlsrv</span> configura
                        <b><tt>QUOTED_IDENTIFIER</tt></b> ON imediatamente após conectar-se a
                        um servidor <acronym class="acronym">SQL</acronym>. Isso faz com que o driver utilize o
                        símbolo delimitador de identificador da <acronym class="acronym">SQL</acronym> padrão
                        (<em class="emphasis"> &quot;</em>) em vez dos colchetes que a sintaxe do
                        <acronym class="acronym">SQL</acronym> Server usa para delimitar identificadores.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        Você pode especificar <span class="property">driver_options</span> como uma chave na
                        matriz de opções. O valor pode ser uma coisa qualquer coisa daqui <a href="http://msdn.microsoft.com/en-us/library/cc296161(SQL.90).aspx" class="link external">&raquo; 
                            http://msdn.microsoft.com/en-us/library/cc296161(SQL.90).aspx</a>.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        Você pode usar  <span class="methodname">setTransactionIsolationLevel()</span> para
                        definir nível de isolamento para a conexão atual. O valor pode ser
                        <b><tt>SQLSRV_TXN_READ_UNCOMMITTED</tt></b>,
                        <b><tt>SQLSRV_TXN_READ_COMMITTED</tt></b>,
                        <b><tt>SQLSRV_TXN_REPEATABLE_READ</tt></b>,
                        <b><tt>SQLSRV_TXN_SNAPSHOT</tt></b> ou
                        <b><tt>SQLSRV_TXN_SERIALIZABLE</tt></b>.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        A partir de Zend Framework 1.9, a distribuição mínima suportada da
                        extesnão <acronym class="acronym">PHP</acronym> para <acronym class="acronym">SQL</acronym> Server
                        da Microsoft é a 1.0.1924.0. e o <acronym class="acronym">MSSQL</acronym> Server Native
                        Client versão 9.00.3042.00.
                    </p>
                </li>
            </ul>
        </div>

        <div class="section" id="zend.db.adapter.adapter-notes.pdo-ibm"><div class="info"><h1 class="title">PDO para IBM DB2 e Informix Dynamic Server (IDS)</h1></div>
            

            <ul class="itemizedlist">
                <li class="listitem">
                    <p class="para">
                        Especifique esse adaptador o método  <span class="methodname">factory()</span>
                        com o nome &#039;<span class="classname">Pdo_Ibm</span>&#039;.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        Esse adaptador usa as extensões <acronym class="acronym">PHP</acronym>
                        <acronym class="acronym">PDO</acronym> e <b><tt>PDO_IBM</tt></b>.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        Você deve usar pelo menos a versão da extensão <b><tt>PDO_IBM</tt></b>
                        1.2.2. Se você tiver uma versão anterior desta extensão, você deve atualizar
                        a extensão <b><tt>PDO_IBM</tt></b> a partir da <acronym class="acronym">PECL</acronym>.
                    </p>
                </li>
            </ul>
        </div>

        <div class="section" id="zend.db.adapter.adapter-notes.pdo-mssql"><div class="info"><h1 class="title">PDO Microsoft SQL Server</h1></div>
            

            <ul class="itemizedlist">
                <li class="listitem">
                    <p class="para">
                        Especifique este adaptador para o método  <span class="methodname">factory()</span>
                        com o nome &#039;<span class="classname">Pdo_Mssql</span>&#039;.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        Esse adaptador usa as extensões <acronym class="acronym">PHP</acronym> pdo e pdo_dblib.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        Microsoft <acronym class="acronym">SQL</acronym> Server não suporta sequências, assim
                         <span class="methodname">lastInsertId()</span> ignora seus argumentos e
                        sempre retorna o último valor gerado para uma
                        chave de autoincremento. O método  <span class="methodname">lastSequenceId()</span>
                        retorna <b><tt>NULL</tt></b>.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        Se você está trabalhando com strings Unicode em uma codificação diferente
                        de <acronym class="acronym">UCS</acronym>-2 (tal como <acronym class="acronym">UTF</acronym>-8), você pode
                        ter que realizar uma conversão no código de sua aplicação ou armazenar os
                        dados em uma coluna binária. Por favor, consulte a <a href="http://support.microsoft.com/kb/232580" class="link external">&raquo; Base de Conhecimento da
                            Microsoft</a> para mais informações.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        <span class="classname">Zend_Db_Adapter_Pdo_Mssql</span> configura
                        <b><tt>QUOTED_IDENTIFIER</tt></b> ON imediatamente depois de
                        conectar-se a um banco de dados <acronym class="acronym">SQL</acronym> Server. Isso
                        faz com que o driver utilize o símbolo delimitador de identificador
                        da <acronym class="acronym">SQL</acronym> padrão ( &quot;) em vez dos colchetes que a sintaxe
                        <acronym class="acronym">SQL</acronym> Server utiliza para delimitar identificadores.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        Você pode especificar <span class="property">pdoType</span> como uma chave na
                        matriz de opções. O valor pode ser &quot;mssql&quot; (o padrão),
                        &quot;dblib&quot;, &quot;FreeTDS&quot;, ou &quot;Sybase&quot;. Essa opção afeta
                        o prefixo <acronym class="acronym">DSN</acronym> que o adaptador usa quando constrói a
                        string <acronym class="acronym">DSN</acronym>. Tanto &quot;FreeTDS&quot; quanto &quot;sybase&quot; implicam
                        um prefixo de &quot;sybase:&quot;, que é usado para o conjunto de bibliotecas
                        <a href="http://www.freetds.org/" class="link external">&raquo; FreeTDS</a>.
                        Veja também
                        <a href="http://www.php.net/manual/en/ref.pdo-dblib.connection.php" class="link external">&raquo; 
                        http://www.php.net/manual/en/ref.pdo-dblib.connection.php </a>
                        Para obter mais informações sobre os prefixos <acronym class="acronym">DSN</acronym>
                        utilizados neste driver.
                    </p>
                </li>
            </ul>
        </div>

        <div class="section" id="zend.db.adapter.adapter-notes.pdo-mysql"><div class="info"><h1 class="title">PDO MySQL</h1></div>
            

            <ul class="itemizedlist">
                <li class="listitem">
                    <p class="para">
                        Especifique este adaptador para o método  <span class="methodname">factory()</span>
                        com o nome &#039;<span class="classname">Pdo_Mysql</span>&#039;.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        Este adaptador usa as extensões <acronym class="acronym">PHP</acronym> pdo e pdo_mysql.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        O MySQL e o MariaDB não suportam sequencias, assim
                         <span class="methodname">lastInsertId()</span> ignora seus argumentos e
                        sempre retorna o último valor gerado para uma
                        chave de autoincremento. O método  <span class="methodname">lastSequenceId()</span>
                        retorna <b><tt>NULL</tt></b>.
                    </p>
                </li>
            </ul>
        </div>

        <div class="section" id="zend.db.adapter.adapter-notes.pdo-oci"><div class="info"><h1 class="title">PDO Oracle</h1></div>
            

            <ul class="itemizedlist">
                <li class="listitem">
                    <p class="para">
                        Especifique este adaptador para o método  <span class="methodname">factory()</span>
                        com o nome &#039;<span class="classname">Pdo_Oci</span>&#039;.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        Este adaptador usa as extensões <acronym class="acronym">PHP</acronym> pdo e pdo_oci.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        Oracle não suporta chaves de autoincremento, assim você
                        deve especificar o nome de uma sequencia para
                         <span class="methodname">lastInsertId()</span> ou
                         <span class="methodname">lastSequenceId()</span>.
                    </p>
                </li>
            </ul>
        </div>

        <div class="section" id="zend.db.adapter.adapter-notes.pdo-pgsql"><div class="info"><h1 class="title">PDO PostgreSQL</h1></div>
            

            <ul class="itemizedlist">
                <li class="listitem">
                    <p class="para">
                        Especifique este adaptador para o método  <span class="methodname">factory()</span>
                        com o nome &#039;<span class="classname">Pdo_Pgsql</span>&#039;.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        Este adaptador usa as extensões <acronym class="acronym">PHP</acronym> pdo e pdo_pgsql.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        PostgreSQL supporta tanto sequencias quanto chaves de
                        autoincremento. Portanto os argumentos para
                         <span class="methodname">lastInsertId()</span> são opcionais. Se você não
                        fornecer argumentos, o adaptador retorna o último valor
                        gerado para uma chave de autoincremento. Se você fornecer
                        argumentos, o adaptador retorna o último valor gerado
                        pela sequencia nomeado de acordo com a convenção
                        &#039;<em class="emphasis">table</em>_<em class="emphasis">column</em>_seq&#039;.
                    </p>
                </li>
            </ul>
        </div>

        <div class="section" id="zend.db.adapter.adapter-notes.pdo-sqlite"><div class="info"><h1 class="title">PDO SQLite</h1></div>
            

            <ul class="itemizedlist">
                <li class="listitem">
                    <p class="para">
                        Especifique este adaptador para o método  <span class="methodname">factory()</span>
                        com o nome &#039;<span class="classname">Pdo_Sqlite</span>&#039;.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        Este adaptador usa as extensões <acronym class="acronym">PHP</acronym> pdo e pdo_sqlite.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        SQLite não suporta sequencias, assim
                         <span class="methodname">lastInsertId()</span> ignora seus argumentos e
                        sempre retorna o último valor gerado para uma
                        chave de autoincremento. O método  <span class="methodname">lastSequenceId()</span>
                        retorna <b><tt>NULL</tt></b>.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        Para conectar-se com um banco de dados SQLite2, especifique
                        <strong class="command">&#039;sqlite2&#039; =&gt; true</strong> na matriz de
                        parâmetros quando criar uma instância do adaptador
                        <span class="classname">Pdo_Sqlite</span>.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        Para conectar-se com um banco de dados SQLite em memória,
                        especifique <strong class="command">&#039;dbname&#039; =&gt; &#039;:memory:&#039;</strong> na
                        matriz de parâmetros quando criar uma instância do
                        adaptador <span class="classname">Pdo_Sqlite</span>.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        Versões antigas do driver SQLite para <acronym class="acronym">PHP</acronym> parecem não
                        suportar os comandos <acronym class="acronym">PRAGMA</acronym> necessários para garantir que
                        nomes de coluna curtos sejam usados em conjuntos de resultados. Se você
                        tem problemas que seus conjuntos de resultados são retornados com
                        chaves da forma &quot;tablename.columnname&quot; quando você faz uma
                        consulta com junção, então você deve atualizar para a versão
                        atual do <acronym class="acronym">PHP</acronym>.
                    </p>
                </li>
            </ul>
        </div>

        <div class="section" id="zend.db.adapter.adapter-notes.firebird"><div class="info"><h1 class="title">Firebird (Interbase)</h1></div>
            

            <ul class="itemizedlist">
                <li class="listitem">
                    <p class="para">
                        Este adaptador usa a extensão <acronym class="acronym">PHP</acronym> php_interbase.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        Firebird (Interbase) não suporta chaves de autoincremento,
                        portanto, você deve especificar o nome de uma sequência para
                         <span class="methodname">lastInsertId()</span> ou
                         <span class="methodname">lastSequenceId()</span>.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        Atualmente, a opção <b><tt>Zend_Db::CASE_FOLDING</tt></b>
                        não é suportada pelo adaptador Firebird (Interbase).
                        Identificadores não citadas são automaticamente devolvidos em
                        maiúsculas.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        O nome do adaptador é <span class="classname">ZendX_Db_Adapter_Firebird</span>.
                    </p>

                    <p class="para">
                        Lembre-se de usar o parâmetro adapterNamespace com o valor
                        <span class="classname">ZendX_Db_Adapter</span>.
                    </p>

                    <p class="para">
                        Recomendamos a atualização de <var class="filename">gds32.dll</var> (ou equivalente
                        Linux) empacotado junto com <acronym class="acronym">PHP</acronym>, para a mesma versão do
                        servidor. Para Firebird o equivalente de <var class="filename">gds32.dll</var> é
                        <var class="filename">fbclient.dll</var>.
                    </p>

                    <p class="para">
                        Por padrão todos os identificadores (nomes de tabela, campos) são
                        devolvidos em caixa
                        alta.
                    </p>
                </li>
            </ul>
        </div>
    </div>
</div>
        <hr />

            <table width="100%">
                <tr>
                    <td width="25%" style="text-align: left;">
                    <a href="zend.db.html">Zend_Db</a>
                    </td>

                    <td width="50%" style="text-align: center;">
                        <div class="up"><span class="up"><a href="zend.db.html">Zend_Db</a></span><br />
                        <span class="home"><a href="manual.html">Guia de Refer&ecirc;ncia do Programador</a></span></div>
                    </td>

                    <td width="25%" style="text-align: right;">
                        <div class="next" style="text-align: right; float: right;"><a href="zend.db.statement.html">Zend_Db_Statement</a></div>
                    </td>
                </tr>
            </table>
</td>
        <td style="font-size: smaller;" width="15%"> <style type="text/css">
#leftbar {
	float: left;
	width: 186px;
	padding: 5px;
	font-size: smaller;
}
ul.toc {
	margin: 0px 5px 5px 5px;
	padding: 0px;
}
ul.toc li {
	font-size: 85%;
	margin: 1px 0 1px 1px;
	padding: 1px 0 1px 11px;
	list-style-type: none;
	background-repeat: no-repeat;
	background-position: center left;
}
ul.toc li.header {
	font-size: 115%;
	padding: 5px 0px 5px 11px;
	border-bottom: 1px solid #cccccc;
	margin-bottom: 5px;
}
ul.toc li.active {
	font-weight: bold;
}
ul.toc li a {
	text-decoration: none;
}
ul.toc li a:hover {
	text-decoration: underline;
}
</style>
 <ul class="toc">
  <li class="header home"><a href="manual.html">Guia de Refer&ecirc;ncia do Programador</a></li>
  <li class="header up"><a href="manual.html">Guia de Refer&ecirc;ncia do Programador</a></li>
  <li class="header up"><a href="reference.html">Refer&ecirc;ncia do Zend Framework</a></li>
  <li class="header up"><a href="zend.db.html">Zend_Db</a></li>
  <li class="active"><a href="zend.db.adapter.html">Zend_Db_Adapter</a></li>
  <li><a href="zend.db.statement.html">Zend_Db_Statement</a></li>
  <li><a href="zend.db.profiler.html">Zend_Db_Profiler</a></li>
  <li><a href="zend.db.select.html">Zend_Db_Select</a></li>
  <li><a href="zend.db.table.html">Zend_Db_Table</a></li>
  <li><a href="zend.db.table.row.html">Zend_Db_Table_Row</a></li>
  <li><a href="zend.db.table.rowset.html">Zend_Db_Table_Rowset</a></li>
  <li><a href="zend.db.table.relationships.html">Zend_Db_Table Relationships</a></li>
  <li><a href="zend.db.table.definition.html">Zend_Db_Table_Definition</a></li>
 </ul>
 </td>
    </tr>
</table>

<script type="text/javascript" src="../js/shCore.js"></script>
<script type="text/javascript" src="../js/shAutoloader.js"></script>
<script type="text/javascript" src="../js/main.js"></script>

</body>
</html>